Поскольку boost::/std::shared_ptr
имеет преимущество типа стирания их Deleter, вы можете делать хорошие вещи, какВиртуальный деструктор, необходимый для вашего интерфейса, если вы всегда храните его в shared_ptr?
#include <memory>
typedef std::shared_ptr<void> gc_ptr;
int main(){
gc_ptr p1 = new int(42);
gc_ptr p2 = new float(3.14159);
gc_ptr p3 = new char('o');
}
И это будет правильно удалить все указатели благодаря правильной Deleter сохранения.
Если вы гарантируете, что каждая реализация вашего интерфейса всегда создается с помощью shared_ptr<Interface>
(или make_shared<Interface>
), вам действительно нужен деструктор virtual
? Я бы объявил это virtual
в любом случае, но я просто хочу знать, так как shared_ptr
всегда будет удалять тип, в котором он был инициализирован (если не указан другой пользовательский отладчик).
Возможный дубликат [shared_ptr magic:]] (http://stackoverflow.com/questions/3899790/shared-ptr-magic) –
@Armen: Это не дубликат, он не спрашивает, как 'shared_ptr' делает это, но нужно ли вам использовать виртуальный деструктор *, знающий *, что 'shared_ptr' делает эту магию. –
@ Давид: Нет, он этого не делает. Он говорит, что в любом случае он будет использовать виртуальный деструктор. Он спрашивает, нормально ли, чтобы он не был. Так что это дубликат –