ideas
ideas copied to clipboard
std::allocate_unique
Перенос предложения: голоса +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);
Павел, 17 апреля 2018, 19:25 не нужен ли подобный механизм сразу и для shared?
Андрей Марцинкевич, 20 апреля 2018, 19:22 Павел Корозевцев, есть std::allocate_shared
Работа над идеей идёт полным ходом, в C++23 должен появиться std::allocate_unique из http://wg21.link/p0211
Работа над идеей идёт полным ходом, в C++23 должен появиться std::allocate_unique из http://wg21.link/p0211
По ссылке какая-то подозрительно простая реализация предлагается.
Allocator
не обязан уметь присваивание, например, std::pmr::polymorphic_allocator
не умеет присваиваться. Т.е. если сложить инстанс такого аллокатора в allocation_deleter<>
, то мы получим unique_ptr
, который не умеет перемещающее присваивание, swap
и т.п. И кому нужен такой unique_ptr
?
не умеет перемещающее присваивание,
swap
и т.п.
но ведь можно в такой allocation_deleter<>
положить аллокатор, предварительно обернув его в unique_ptr<void, void (*)(const void*)>
? :)
А кто для вложенного unique_ptr
будет память выделять?
реализация https://www.boost.org/doc/libs/1_79_0/libs/smart_ptr/doc/html/smart_ptr.html#allocate_unique рассматривается?