首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用shared_ptr的例子?

使用shared_ptr的例子?
EN

Stack Overflow用户
提问于 2010-08-13 20:48:25
回答 5查看 170.8K关注 0票数 82

嗨,今天我问了一个关于How to insert different types of objects in the same vector array 的问题,我在这个问题中的代码是

代码语言:javascript
复制
 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
 } 

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

代码语言:javascript
复制
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 pointer containers

shared_ptr。在过去的3个小时里,我一直在阅读这个主题,但文档对我来说似乎相当高级。*谁能给我一个shared_ptr用法的小代码示例,以及为什么他们建议使用shared_ptr。还有其他类型,如ptr_vectorptr_listptr_deque*

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

代码语言:javascript
复制
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 );
...........
}

而且我不懂语法!

EN

回答 5

Stack Overflow用户

发布于 2010-08-13 21:12:18

在我看来,学习使用智能指针是成为一名称职的C++程序员最重要的步骤之一。正如您所知道的,每当您在某个时刻新建一个对象时,您都希望将其删除。

出现的一个问题是,在有异常的情况下,很难确保一个对象在所有可能的执行路径中总是只释放一次。

这就是RAII的原因:http://en.wikipedia.org/wiki/RAII

创建一个帮助器类,目的是确保一个对象总是在所有执行路径中被删除一次。

这样的类的例子是: std::auto_ptr

但有时您喜欢与其他人共享对象。只有当没有人再使用它时,它才应该被删除。

为了帮助实现这一点,已经开发了引用计数策略,但您仍然需要记住addref并手动释放ref。本质上,这与new/delete的问题是一样的。

这就是boost开发boost::shared_ptr的原因,它是引用计数智能指针,这样你就可以共享对象,而不会无意中泄漏内存。

随着C++ tr1的添加,它现在也被添加到了c++标准中,但它的名称是std::tr1::shared_ptr<>。

如果可能的话,我推荐使用标准的共享指针。ptr_dequeue和so是IIRC专门用于指针类型的容器。我暂时忽略它们。

因此,我们可以从您的示例开始:

代码语言:javascript
复制
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(); 
} 

现在的问题是,每当G离开作用域时,我们就会泄漏添加到G中的两个对象。让我们重写它以使用std::tr1::shared_ptr

代码语言:javascript
复制
// Remember to include <memory> for shared_ptr
// First do an alias for std::tr1::shared_ptr<gate> so we don't have to 
// type that in every place. Call it gate_ptr. This is what typedef does.
typedef std::tr1::shared_ptr<gate> gate_ptr;    
// gate_ptr is now our "smart" pointer. So let's make a vector out of it.
std::vector<gate_ptr> G; 
// these smart_ptrs can't be implicitly created from gate* we have to be explicit about it
// gate_ptr (new ANDgate), it's a good thing:
G.push_back(gate_ptr (new ANDgate));  
G.push_back(gate_ptr (new ORgate)); 
for(unsigned i=0;i<G.size();++i) 
{ 
   G[i]->Run(); 
} 

当G超出作用域时,会自动回收内存。

作为一个练习,我让我团队中的新手们去写他们自己的智能指针类。然后在你完成后,立即丢弃这个类,并且永远不再使用它。希望您获得了有关智能指针如何在引擎盖下工作的关键知识。真的没有魔法。

票数 20
EN

Stack Overflow用户

发布于 2010-08-13 21:13:00

boost文档提供了一个很好的开始示例:shared_ptr example (实际上是关于智能指针的向量)或shared_ptr doc以下答案很好地解释了boost智能指针:smart pointers explained

ptr_vector背后的想法(用尽可能少的话)是,它为您处理存储的指针后面的内存释放:假设您有一个指针向量,如示例中所示。当退出应用程序或离开定义向量的作用域时,您必须自行清理(您已经动态分配了ANDgate和ORgate),但仅清除向量是不会做到这一点的,因为向量存储的是指针而不是实际的对象(它不会销毁它包含的对象)。

代码语言:javascript
复制
 // 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<>将为您处理上述操作-这意味着它将释放它存储的指针后面的内存。

票数 2
EN

Stack Overflow用户

发布于 2013-05-29 21:42:28

通过Boost,您可以做到这一点>

代码语言:javascript
复制
std::vector<boost::any> vecobj;
    boost::shared_ptr<string> sharedString1(new string("abcdxyz!"));    
    boost::shared_ptr<int> sharedint1(new int(10));
    vecobj.push_back(sharedString1);
    vecobj.push_back(sharedint1);

用于在向量容器中插入不同类型的对象。虽然你必须使用与dynamic_cast类似的any_cast进行访问,但希望它能满足你的需要。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3476938

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档