Был такой код:
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 и решил не писать виртуальный деструктор.
Мораль сей басни – не экономьте на спичках :)
Комментариев нет:
Отправить комментарий