ideas icon indicating copy to clipboard operation
ideas copied to clipboard

std::allocate_unique

Open apolukhin opened this issue 3 years ago • 6 comments

Перенос предложения: голоса +13, -0 Автор идеи: Андрей Марцинкевич

В общем мы имеем std::make_unique, но почему то не имеем std::allocate_unique для работы с кастомными аллокаторами. Ибо инициализировать сейчас unique_ptr для кастомного аллокатора довольно не тривиально (выделить память, вызвать конструктор, написать правильно custom_deleter). Поэтому и предлагаю вынести всю эту работу в std::allocate_unique. Думаю добавить его в STL особо не составит труда.

Пример использования:

CustomAlloc<CustomStruct> alloc;
auto up = std::allocate_unique<int>(alloc, customArg);

//вместо

CustomAlloc<CustomStruct>  alloc;

auto newObj = new (alloc.allocate(1)) TestStruct,

auto dealloc = [alloc = std::move(alloc)](CustomStruct* obj)
{
  obj->~CustomStruct(); 
  alloc.deallocate(obj, 1);
};


auto up = std::unique_ptr<TestStruct, decltype(dealloc)>(newObj, dealloc);

apolukhin avatar Mar 30 '21 08:03 apolukhin

Павел, 17 апреля 2018, 19:25 не нужен ли подобный механизм сразу и для shared?

Андрей Марцинкевич, 20 апреля 2018, 19:22 Павел Корозевцев, есть std::allocate_shared

apolukhin avatar Mar 30 '21 08:03 apolukhin

Работа над идеей идёт полным ходом, в C++23 должен появиться std::allocate_unique из http://wg21.link/p0211

apolukhin avatar Mar 30 '21 08:03 apolukhin

Работа над идеей идёт полным ходом, в C++23 должен появиться std::allocate_unique из http://wg21.link/p0211

По ссылке какая-то подозрительно простая реализация предлагается. Allocator не обязан уметь присваивание, например, std::pmr::polymorphic_allocator не умеет присваиваться. Т.е. если сложить инстанс такого аллокатора в allocation_deleter<>, то мы получим unique_ptr, который не умеет перемещающее присваивание, swap и т.п. И кому нужен такой unique_ptr?

matwey avatar May 23 '22 12:05 matwey

не умеет перемещающее присваивание, swap и т.п.

но ведь можно в такой allocation_deleter<> положить аллокатор, предварительно обернув его в unique_ptr<void, void (*)(const void*)>? :)

tomilov avatar May 23 '22 18:05 tomilov

А кто для вложенного unique_ptr будет память выделять?

matwey avatar May 23 '22 19:05 matwey

реализация https://www.boost.org/doc/libs/1_79_0/libs/smart_ptr/doc/html/smart_ptr.html#allocate_unique рассматривается?

Lishen1 avatar Oct 26 '22 09:10 Lishen1