Поскольку 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
всегда удаляет тип, которым он был инициализирован (если не указан другой настраиваемый удалитель).
shared_ptr
это делает, а нужно ли использовать виртуальный деструктор зная, чтоshared_ptr
творит магию. - person David Rodríguez - dribeas   schedule 09.07.2011shared_ptr
экземпляры, которые могут указывать на производный тип, тогда вы почти наверняка используетеvirtual
функции-члены, верно? Иначе какой смысл? Так что в этом случае создание виртуального деструктора ничего не стоит ... кроме, может быть, небольшого дополнительного набора текста :) - person Karl Knechtel   schedule 09.07.2011delete(void*)
. Я не вижу связи между настраиваемым средством удаления и указателем на удаление через базовый указатель. - person Kerrek SB   schedule 09.07.2011void*
, но привести его к правильному типу,int
,float
иchar
соответственно. - person Xeo   schedule 09.07.2011