Нужен ли виртуальный деструктор для вашего интерфейса, если вы всегда храните его в 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 (или make_shared ) , вам действительно нужен виртуальный деструктор? В любом случае я бы объявил его виртуальным ,но я просто хочу знать, поскольку shared_ptr всегда удаляет тип, которым он был инициализирован (если не указан другой пользовательский удалитель).

12
задан Xeo 19 December 2011 в 15:28
поделиться