Пространство дизайна умных указателей велико и разнообразно;но многие варианты дизайна подразумевают строгие ограничения.
Для любого совместно используемого умного указателя единственная альтернатива для сохранения лямбда-функции до delete static_cast<T*>(p);
(или «стирание типа») - это использование удаления для последнего умного указателя-владельца.в группе.
Это можно сделать, если вы вообще не разрешаете преобразование, и у всех владельцев одинаковое значение указателя.Таким образом, уничтожение последнего экземпляра гарантированно всегда будет приводить к одному и тому же эффекту.
Если вы разрешаете преобразование даже в базовое преобразование, это означает, что результат будет четко определен, только если управляемый объект имеет виртуальныйдеструктор.Вы можете иметь поддержку static_cast
и dynamic_cast
для значения указателя.
Это означает, что у вас не может быть пользовательского объекта удаления, который не является частью типа интеллектуального указателя.
Нельзя создать собственный интеллектуальный указатель, в котором блок управления может быть выделен как часть объекта (как make_shared
), если только интеллектуальный указатель не имеет другого типа.
Вы не делаетене имеет обобщенного «конструктора псевдонимов», поэтому вы не можете получить интеллектуальный указатель на произвольный подобъект или объект, принадлежащий исходному объекту.(Таким образом, если у вас есть умный указатель на коллекцию, вы не можете создать умный указатель на элемент коллекции, который поддерживает жизнь коллекции, пока этот элемент необходим.)
Идем по этому пути (избегая затрат на абстрагирование delete p;
), блок управления будет меньше, а удаление будет несколько более быстрым, но, вероятно, также приведет к увеличению количества специализированных интеллектуальных указателей, владеющих различными несовместимыми типами , поскольку другие операциичасто будет необходимо на практике.