Ми з паном Лідстремом посварились :)
Твердження пана Лідстрема полягає в тому, що конструкція 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, не вимагаючи, щоб поліморфні класи мали віртуальний деструктор? Спасибі заздалегідь