понедельник, 14 марта 2011 г.

shared_ptr vs auto_ptr

Был такой код:

struct IInterf
{
virtual void func() = 0;
};
boost::shared_ptr
<IInterf> PInterf;

PInter createObj();

Через некоторое время стало ясно, что у объекта будет конкретный владелец и я заменил shared_ptr на auto_ptr.


И словил access violation при завершении программы.


Минут через 5 сообразил, что деструктор не виртуальный; shared_ptr динамически создает “удалятель”, зная истинный тип IInterf, а auto_ptr просто зовет delete p.


Когда я писал IInterf, то подумал что он будет всегда обернут в shared_ptr и решил не писать виртуальный деструктор.


Мораль сей басни – не экономьте на спичках :)

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

Отправить комментарий