четверг, 20 ноября 2008 г.

boost::shared_ptr - особенность удаления объектов

Увидал на блоге Raider'a (кстати, рекомендую).

Ситуация:
class A { ... };
class B : public A { ... };
std::vector BunchOfObjects;
BunchOfObjects.push_back(new B);


Главное - не забыть уничтожить удаляемые из контейнера объекты. И если делать это через оператор delete - еще про виртуальный деструктор у базового класса не забыть бы.

Хотя... другое классическое решение позволяет обойтись и без первого и без второго:

std::vector > BunchOfObjects;
BunchOfObjects.push_back(boost::shared_ptr(new B));


Наличие виртуального деструктора в таком случае не принципиально - shared_ptr запоминает как нужно удалять объект, по умолчанию это будет оператор delete для нужного типа.


BTW, при наличии виртуального деструктора, если уж связались с boost, и shared_ptr'ы используются только в этом контейнере, логичнее использовать
boost::ptr_container.

Комментариев нет: