Использование make_shared и allocate_shared в boost?

Я не могу понять документацию буста о том, как использовать make_shared а также allocate_shared для инициализации общих массивов и указателей:

shared_ptr<int> p_int(new int); // OK
shared_ptr<int> p_int2 = make_shared<int>(); // OK
shared_ptr<int> p_int3 = allocate_shared(int);  // ??


shared_array<int> sh_arr(new int[30]); // OK
shared_array<int> sh_arr2 = make_shared<int[]>(30); // ??
shared_array<int> sh_arr3 = allocate_shared<int[]>(30); // ??

Я пытаюсь узнать правильный синтаксис для инициализации вышеупомянутых переменных, прокомментированных как // ??

1 ответ

Решение

allocate_shared используется так же, как make_sharedза исключением того, что вы передаете распределитель в качестве первого аргумента.

boost::shared_ptr<int> p_int(new int);
boost::shared_ptr<int> p_int2 = boost::make_shared<int>();

MyAllocator<int> alloc;
boost::shared_ptr<int> p_int3 = boost::allocate_shared<int>(alloc);

Здесь нет make функция для boost::shared_array, так что единственный способ сделать это - выделить память вручную:

boost::shared_array<int> sh_arr(new int[30]);

Но boost::make_shared и т. д. поддерживают типы массивов - либо с неизвестным размером, либо с фиксированным размером - в обоих случаях a boost::shared_ptr возвращается:

boost::shared_ptr<int[]> sh_arr2 = boost::make_shared<int[]>(30);
boost::shared_ptr<int[30]> sh_arr3 = boost::make_shared<int[30]>();

Обратите внимание, что std::shared_ptr в настоящее время не поддерживает массивы.

Другие вопросы по тегам