Ми з паном Лідстремом посварились :)
Твердження пана Лідстрема полягає в тому, що конструкція shared_ptr<Base> p(new Derived);
не вимагає від Base наявності віртуального деструктора:
Армен Цирунян : "Дійсно? Чи правильно буде очищати shared_ptr ? Чи не могли б ви, у цьому випадку, продемонструвати, як цей ефект можна реалізувати?"
Даніель Лідстрем : " shared_ptr використовує власний деструктор для видалення конкретного екземпляра. Це відоме як RAII у спільноті C ++. Моя порада полягає в тому, що ви дізнаєтеся все, що можна про RAII. Це значно полегшить ваше кодування на C ++, коли ви використовуєте RAII у всіх ситуаціях ".
Армен Цирунян : "Я знаю про RAII, і я також знаю, що врешті-решт деструктор shared_ptr може видалити збережений px, коли pn досягає 0. Але якщо px мав вказівник статичного типу та вказівник
Base
динамічного типуDerived
, то якщо уBase
нього немає віртуального деструктора, це призведе до невизначеної поведінки. Виправте мене, якщо я помиляюся ".Даніель Лідстрем : " shared_ptr знає, що статичний тип - це Concrete. Він знає це, оскільки я передав його в його конструктор! Це схоже на магію, але я можу запевнити вас, що це за дизайном і надзвичайно приємно".
Отже, судіть нас. Як можна (якщо це можливо) реалізувати shared_ptr, не вимагаючи, щоб поліморфні класи мали віртуальний деструктор? Спасибі заздалегідь