Я думаю, что пользовательский распределитель будет использоваться для выделения пространства для объекта «с общим счетом», в котором хранится копия деаллокатора (удалителя) и счетчика ссылок.быть использованным для ...
Одно упоминание уже упоминалось: сделать shared_ptr
совместимым с объектами, которые должны быть удалены какой-либо специальной функцией (например, FILE
, которая удаляется fclose
), без необходимостиоберните его во вспомогательный класс, который позаботится о правильном удалении.
Еще одно использование пользовательского средства удаления - пулы.Пул может выдать shared_ptr<T>
, которые были инициализированы «специальным» удалителем, который на самом деле ничего не удаляет, но вместо этого возвращает объект в пул.
И еще одна вещь: удалитель уженеобходимо реализовать некоторые shared_ptr
функции.Например, удаляемый тип всегда фиксируется во время создания и не зависит от типа инициализируемого shared_ptr
.
Вы можете создать shared_ptr<Base>
, фактически инициализировав его с Derived
.shared_ptr
гарантирует, что при удалении объекта он будет удален как Derived
, даже если Base
не имеет , а не имеет виртуального dtor.Чтобы сделать это возможным, shared_ptr
уже должен хранить некоторую информацию о том, как объект должен быть удален.Таким образом, разрешение пользователю указать полностью настраиваемое средство удаления ничего не стоит (с точки зрения производительности во время выполнения) и не требует большого количества дополнительного кода.
Вероятно, существуют десятки других сценариев, в которых можно сделатьхорошее использование пользовательского удалителя, это то, что я до сих пор придумал.