你好,我今天问了一个关于如何在同一个向量数组中插入不同类型的对象 https://stackoverflow.com/questions/3475030/different-types-of-objects-in-the-same-vector-array我在该问题中的代码是
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指针容器
http://www.boost.org/doc/libs/1_43_0/libs/ptr_container/doc/guidelines.html or shared_ptr
。我花了过去 3 个小时阅读有关该主题的内容,但该文档对我来说似乎相当先进。 ****谁能给我一个小代码示例shared_ptr
用法以及他们建议使用的原因shared_ptr
。还有其他类型吗ptr_vector
, ptr_list
and ptr_deque
** **
Edit1:我也读过一个代码示例,其中包括:
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 );
...........
}
而且我不明白语法!
Using a vector
of shared_ptr
消除了由于忘记遍历向量并调用而导致内存泄漏的可能性delete
在每个元素上。让我们逐行浏览该示例的稍微修改后的版本。
typedef boost::shared_ptr<gate> gate_ptr;
为共享指针类型创建别名。这避免了 C++ 语言中由于键入而导致的丑陋std::vector<boost::shared_ptr<gate> >
并忘记结束之间的空格大于号.
std::vector<gate_ptr> vec;
创建一个空向量boost::shared_ptr<gate>
对象。
gate_ptr ptr(new ANDgate);
分配一个新的ANDgate
实例并将其存储到shared_ptr
。单独执行此操作的原因是为了防止操作抛出时可能出现的问题。在此示例中这是不可能的。这Boost shared_ptr“最佳实践” http://www.boost.org/doc/libs/1_43_0/libs/smart_ptr/shared_ptr.htm#BestPractices解释为什么它是一个最佳实践分配到独立对象而不是临时对象。
vec.push_back(ptr);
这会在向量中创建一个新的共享指针并复制ptr
进去。内部的引用计数shared_ptr
确保分配的对象内部ptr
被安全地转移到载体中。
没有解释的是析构函数shared_ptr<gate>
确保删除分配的内存。这就是避免内存泄漏的地方。析构函数为std::vector<T>
确保析构函数T
为向量中存储的每个元素调用。然而,指针的析构函数(例如,gate*
) 不会删除您分配的内存。这就是你试图通过使用来避免的shared_ptr
or ptr_vector
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)