[c++] 使用shared_ptr的示例?


Answers

我将添加关于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通常是不安全的。 除非你确定该类不再使用该对象。 因为如果你把它放在一个shared_ptr ,并且它超出了范围,当这个类可能仍然需要它时,这个对象将被释放。

Question

嗨,我今天问了一个问题,关于如何在同一个向量数组中插入不同类型的对象,并且我的代码在该问题中

 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 );
...........
}

我不明白这个语法!




boost文档提供了一个非常好的开始示例: shared_ptr示例 (实际上是关于智能指针向量)或shared_ptr doc Johannes Schaub的以下回答很好地解释了智能指针: 智能指针解释

背后的想法(尽可能少的话)ptr_vector是它为你处理存储指针背后的内存释放:假设你有一个指针向量,如你的例子。 在退出应用程序或离开定义向量的范围时,您必须自行清理(您已动态分配ANDgate和ORgate),但只是清除向量不会执行此操作,因为向量正在存储指针而不是实际的对象(它不会破坏它的内容)。

 // if you just do
 G.clear() // will clear the vector but you'll be left with 2 memory leaks
 ...
// to properly clean the vector and the objects behind it
for (std::vector<gate*>::iterator it = G.begin(); it != G.end(); it++)
{
  delete (*it);
}

boost :: ptr_vector <>将为您处理上述内容 - 意味着它将释放它存储的指针背后的内存。




#include <memory>
#include <iostream>

class SharedMemory {
    public: 
        SharedMemory(int* x):_capture(x){}
        int* get() { return (_capture.get()); }
    protected:
        std::shared_ptr<int> _capture;
};

int main(int , char**){
    SharedMemory *_obj1= new SharedMemory(new int(10));
    SharedMemory *_obj2 = new SharedMemory(*_obj1);
    std::cout << " _obj1: " << *_obj1->get() << " _obj2: " << *_obj2->get()
    << std::endl;
    delete _obj2;

    std::cout << " _obj1: " << *_obj1->get() << std::endl;
    delete _obj1;
    std::cout << " done " << std::endl;
}

这是shared_ptr的一个例子。 _obj2被删除,但指针仍然有效。 输出是,./test _obj1:10 _obj2:10 _obj2:10完成




Related