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