如何删除向量的多个添加指针?

时间:2011-07-04 14:18:18

标签: c++ pointers vector delete-operator

我有一个带有一些(在其他类对象中)多个添加对象的向量

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。”

如何解决这个问题?

3 个答案:

答案 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()”中只分配了一次内存并且你要删除它两次。你应该分配两次然后你的代码不会抛出异常。