使用shared_ptr的示例?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (31)

gate* G[1000]; G[0] = new ANDgate() ; G[1] = new ORgate; //gate is a class inherited by ANDgate and ORgate classes class gate { ..... ...... virtual void Run() { //A virtual function } }; class ANDgate :public gate {..... ....... void Run() { //AND version of Run } }; class ORgate :public gate {..... ....... void Run() { //OR version of Run } }; //Running the simulator using overloading concept for(...;...;..) { G[i]->Run() ; //will run perfectly the right Run for the right Gate type }

我想使用矢量,所以有人写道,我应该这样做:

std::vector<gate*> G;
G.push_back(new ANDgate); 
G.push_back(new ORgate);
for(unsigned i=0;i<G.size();++i)
{
  G[i]->Run();
}

但后来他和其他人建议我最好使用Boost指针容器 shared_ptr。我花了最近3个小时阅读这个主题,但文档看起来相当先进。****任何人都可以给我一个小代码的shared_ptr使用示例,以及他们为什么建议使用shared_ptr。也有其他类型,如ptr_vectorptr_listptr_deque** **

编辑1:我也读过一个代码示例,其中包括:

typedef boost::shared_ptr<Foo> FooPtr;
.......
int main()
{
  std::vector<FooPtr>         foo_vector;
........
FooPtr foo_ptr( new Foo( 2 ) );
  foo_vector.push_back( foo_ptr );
...........
}

我不明白这个语法!

提问于
用户回答回答于

使用vectorshared_ptr消除泄漏内存,因为你忘了走路载体和调用的可能性delete每个元素。让我们一行一行地稍微修改一下示例。

typedef boost::shared_ptr<gate> gate_ptr;

为共享指针类型创建一个别名。这样可以避免由于键入std::vector<boost::shared_ptr<gate> >和忘记关闭大于号之间的空间而导致的C ++语言中的丑陋。

    std::vector<gate_ptr> vec;

创建一个空的矢量boost::shared_ptr<gate>对象。

    gate_ptr ptr(new ANDgate);

分配一个新ANDgate实例并将其存储到一个shared_ptr。分开这样做的原因是为了防止操作抛出时可能发生的问题。在这个例子中这是不可能的。该升压shared_ptr“最佳实践”解释了为什么这是一个最好的做法来分配到一个独立的对象,而不是暂时的。

    vec.push_back(ptr);

这将在向量中创建一个新的共享指针并将其复制ptr到其中。在内核中引用计数shared_ptr可确保将分配的内部对象ptr安全地转移到向量中。

没有解释的是析构函数shared_ptr<gate>确保分配的内存被删除。这是避免内存泄漏的地方。析构函数用于std::vector<T>确保T为存储在向量中的每个元素调用析构函数。但是,指针的析构函数(例如,gate*不会删除已分配的内存。这就是你试图通过使用shared_ptr或避免ptr_vector

用户回答回答于

我将增加约重要的事情是一个shared_ptr的是只有不断构建他们的语法如下:

shared_ptr<Type>(new Type(...));

这样,“真实” Type指针对您的作用域是匿名的,并且由共享指针保存。因此你不可能不小心使用这个“真实”指针。换句话说,永远不要这样做:

Type* t_ptr = new Type(...);
shared_ptr<Type> t_sptr ptrT(t_ptr);
//t_ptr is still hanging around!  Don't use it!

尽管这会起作用,但是现在您的函数中有一个Type*指针(t_ptr),它位于共享指针之外。在t_ptr任何地方使用都是危险的,因为你永远不知道何时持有它的共享指针可能会破坏它,并且会发生段错误。

其他类返回给你的指针也一样。如果你没有写的课程给你一个指针,把它放在一个通常是不安全的shared_ptr。除非你确定该类不再使用该对象。因为如果你把它放在a中shared_ptr,并且它超出了范围,当类仍然需要它时,该对象将被释放。

所属标签

可能回答问题的人

  • HKC

    红客学院 · 创始人 (已认证)

    26 粉丝7 提问5 回答
  • Dingda

    Dingda · 站长 (已认证)

    4 粉丝0 提问3 回答
  • 西风

    renzha.net · 站长 (已认证)

    9 粉丝1 提问3 回答
  • 螃蟹居

    1 粉丝0 提问2 回答

扫码关注云+社区

领取腾讯云代金券