Управление памятью с новым ключевым словом и вектором указателей STL - PullRequest
1 голос
/ 21 декабря 2009

Как работает деструктор для вектора при добавлении элементов в этот список? Правильно ли уничтожен объект, когда он выходит из области видимости? Есть ли случаи, когда это не удалит объект правильно? Например, каковы последствия, если «таблица» была дочерней по отношению к объекту, и мы добавили новую таблицу в вектор указателей на объекты?

vector <object*> _objectList;

_objectList.PushBack(new object);

Ответы [ 4 ]

7 голосов
/ 21 декабря 2009

Поскольку вы создаете вектор «голых» указателей, C ++ не может знать, что эти указатели предназначены для «владения» объектами, на которые они указывают, и поэтому не будут вызывать эти объекты ». деструкторы, когда указатель уходит. Вы должны использовать простой «умный» указатель вместо «пустого» указателя в качестве элемента vector. Например, Boost's shared_ptr будет вполне достаточно для этой задачи (хотя вы, несомненно, можете сделать это с «более дешевыми», более легкими подходами, если вы не хотите иметь дело с Boost в целом и имеете больше нет необходимости в умных указателях в вашем коде).

Редактировать : поскольку вы (ОП) говорите, что использование такой инфраструктуры, как Boost, невозможно, и пара комментариев полезно указывают на то, что даже упаковка std::auto_ptr не делает ' Чтобы это действительно можно было назвать достойным ярлыком, вам, возможно, придется реализовать собственные умные указатели (или, если вы обнаружите, что автономный класс шаблонов умных указателей с открытым исходным кодом выглядит удобным, проверьте его на соответствие вашим требованиям). Эта статья - полезный учебник для интеллектуальных указателей в C ++, независимо от того, нужно ли вам самостоятельно развернуть или проверить существующую реализацию.

5 голосов
/ 21 декабря 2009

Вы можете использовать bost 'ptr_vector' . Он будет автоматически уничтожать объекты, на которые указывают элементы, когда они либо удаляются, либо экземпляр ptr_vector выходит за пределы области видимости. Более подробная информация доступна здесь .

2 голосов
/ 21 декабря 2009

В вашем случае указатели объектов уничтожаются должным образом, но сами объекты не будут затронуты. STL должным образом уничтожает все содержащиеся в нем элементы - но не будет неявно разыменовывать указатели на типы.

1 голос
/ 21 декабря 2009

STL Векторы делают копию того, что вы туда поместили, и в конечном итоге удаляете эту копию.

Таким образом, в этом случае вектор хранит указатель на объект, а не сам объект.Таким образом, он создает копию указателя и удаляет указатель.Но, как сказал Крис , сам объект не будет удален.

Итак, решения:

Если вам действительно не нужно использовать указатели, тогда неt:

vector <object> _objectList;
_objectList.PushBack(object());

Если вам нужно использовать указатели, вы можете использовать умный указатель (который обрабатывает подсчет ссылок и удалит объект вместе с указателем), например Alexпредложил , или используйте ptr_vector, , как сказал Игорь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...