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

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

Ситуация:

class A { ... };
class B : public A { ... };
std::vector BunchOfObjects;
BunchOfObjects.push_back(new B);

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

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

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

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

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