Как удалить несколько добавленных указателей на вектор? - PullRequest
1 голос
/ 04 июля 2011

У меня есть вектор с несколькими (среди других классовых объектов) несколькими добавленными объектами

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 ]

3 голосов
/ 04 июля 2011

Используйте shared_ptr.Вы можете найти это в C ++ 0x, TR1 или Boost.shared_ptr знает, сколько указателей все еще указывают на объект и удаляют его только тогда, когда он последний.

2 голосов
/ 04 июля 2011

Решите это, не используя ужасную идею хранения сырых указателей в контейнере.Вместо этого используйте контейнер интеллектуальных указателей:

#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 в этом случае, потому что это новый трюк с использованием ссылок и пересылки rvalue.)

0 голосов
/ 04 июля 2011

Я думаю, что исключение связано с тем, что вы выделяете память только один раз в "Bar * b = new Bar ()", и вы удаляете ее дважды. Вы должны выделить дважды, и тогда ваш код не выбрасывает исключение.

...