Вы можете использовать std::shared_ptr
с пользовательским распределителем, используя std::allocate_shared
. В любом случае, это, вероятно, то, что вам нужно, поскольку я предполагаю, что вы хотите, чтобы блок управления (т. Е. Счетчик ссылок) также выделялся с помощью распределителя пула.
При создании объекта с использованием std::allocate_shared
, копия распределителя хранится внутри shared_ptr
, поэтому при уничтожении будет вызываться правильный deallocate()
.
Обратите внимание, что вы также можете создать std::shared_ptr
с помощью пользовательского средства удаления, например:
auto allocator = getAllocator<Foo>();
auto ptr = std::shared_ptr<Foo>(new(allocator.allocate()) Foo,
[&allocator](auto * ptr) { allocator.deallocate(ptr); });
Однако, как я уже упоминал, это, вероятно, не то, что вам нужно, поскольку пространство для счетчиков ссылок не будет выделяться с использованием вашего объекта-распределителя.
Кстати, на случай, если вы все еще "ходите по магазинам" Вот еще одна реализация пула памяти, которая мне очень нравится: foonathan :: memory . Он предоставляет свои allocate_shared
.