Подтвердить что ты не робот

Виртуальный деструктор, необходимый для вашего интерфейса, если вы всегда храните его в shared_ptr?

Так как boost::/std::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');
}

И это будет корректно удалять все указатели благодаря сохранению правильного удаления.

Если вы гарантируете, что каждая реализация вашего интерфейса всегда создается с помощью shared_ptr<Interface> (или make_shared<Interface>), вам действительно нужен деструктор virtual? Я бы объявил его virtual в любом случае, но я просто хочу знать, поскольку shared_ptr всегда будет удалять тип, с которым он был инициализирован (если не задан другой пользовательский отладчик).

4b9b3361

Ответ 1

Я все равно буду следовать общему правилу для классов, которые должны быть выведены:

Предоставить либо общедоступный виртуальный деструктор, либо защищенный не виртуальный деструктор

Причина в том, что вы не можете контролировать все виды использования, и это простое правило означает, что компилятор будет отмечать, если вы попытаетесь выполнить delete через неправильный уровень в иерархии. Учтите, что shared_ptr не гарантирует, что он вызовет соответствующий деструктор, только то, что он вызовет деструктор статического типа, который использовался как аргумент:

base* foo();
shared_ptr<base> p( foo() );

Если base имеет общедоступный не виртуальный деструктор, а foo возвращает тип, полученный из base, то shared_ptr не сможет вызвать правильный деструктор. Если деструктор base является виртуальным, все будет хорошо, если он защищен, компилятор скажет вам, что там есть ошибка.