我有一个带有一些(在其他类对象中)多个添加对象的向量
class Foo {
...
vector<Bar*> v;
Bar* b = new Bar();
v.push_back(b);
v.push_back(b);
...
}
在Foo的析构函数中我做了
for (vector<Bar*>::iterator it = v.begin(); it != v.end(); ++it)
delete *it;
这会导致第二次迭代出现异常,因为该对象已被解除分配:“访问冲突读取位置0xfeeefee2。”
如何解决这个问题?
答案 0 :(得分:3)
使用shared_ptr
。您可以在C ++ 0x,TR1或Boost中找到它。 shared_ptr
知道有多少指针仍然指向一个对象,只有当它是最后一个时才删除它。
答案 1 :(得分:2)
通过不使用将原始指针存储在容器中的可怕想法来解决它。相反,使用智能指针容器:
#include <memory>
#include <vector>
typedef std::shared_ptr<Foo> FooPtr;
std::vector<FooPtr> v;
FooPtr b(new Bar()); // #1
v.push_back(b);
v.push_back(b);
v.push_back(b);
// C++0x: even better method:
auto c = std::make_shared<Bar>(); // #2
v.push_back(c);
v.push_back(c);
v.push_back(std::make_shared<Bar>()); // #3
// Three distinct allocations of a Bar object have happened, #1, #2, and #3.
// No explicit deletions!
如果您没有C ++ 0x,请使用TR1库:
#include <tr1/memory>
typedef std::tr1::shared_ptr<Foo> FooPtr;
(在这种情况下,您没有make_shared
,因为这是使用右值引用和转发的新噱头。)
答案 2 :(得分:0)
我认为异常是由于你在“Bar * b = new Bar()”中只分配了一次内存并且你要删除它两次。你应该分配两次然后你的代码不会抛出异常。