Поскольку 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