Г-н. У Лидстрема и меня был аргумент:)
г. Требование Lidström состоит в том, что конструктор shared_ptr<Base> p(new Derived);
не требует, чтобы Base имел виртуальный деструктор:
Армен Цирунян: "Действительно? Будет ли очистка shared_ptr правильно? Не могли бы вы в этом случае продемонстрировать, как этот эффект может быть реализован?"
Daniel Lidström: "shared_ptr использует свой собственный деструктор для удаления экземпляра Concrete. Это называется RAII в сообществе С++. Мой совет заключается в том, что вы узнаете все о RAII. сделайте ваше С++-кодирование намного проще, когда вы используете RAII во всех ситуациях".
Армен Цирунян: "Я знаю об RAII, и я также знаю, что в конечном итоге деструктор shared_ptr может удалить сохраненные px, когда pn достигнет 0. Но если px имеет указатель статического типа на
Base
и динамический указатель типаDerived
, тогда, еслиBase
не имеет виртуального деструктора, это приведет к поведению undefined. Исправьте меня, если я ошибаюсь."Daniel Lidström: "shared_ptr знает, что статический тип - это Concrete. Он знает это, потому что я передал его в своем конструкторе! Кажется, это немного похоже на магию, но я могу заверить вас, что это по дизайну и очень приятно".
Итак, судите нас. Как возможно (если это так) реализовать shared_ptr, не требуя, чтобы полиморфные классы имели виртуальный деструктор? Спасибо заранее