Подтвердить что ты не робот

Можете ли вы выделить массив с чем-то эквивалентным make_shared?

buffer = new char[64];
buffer = std::make_shared<char>(char[64]); ???

Можно ли выделить память массиву с помощью make_shared<>()?

Я мог бы сделать: buffer = std::make_shared<char>( new char[64] );

Но это все еще связано с вызовом нового, это, на мой взгляд, make_shared безопаснее и эффективнее.

4b9b3361

Ответ 1

Точка make_shared должна включать управляемый объект в блок управления общего указателя,

Поскольку вы имеете дело с С++ 11, возможно, использование массива С++ 11 удовлетворит ваши цели?

#include <memory>
#include <array>
int main()
{
    auto buffer = std::make_shared<std::array<char, 64>>();
}

Обратите внимание, что вы не можете использовать общий указатель так же, как указатель, который вы получили от нового [], потому что std::shared_ptr (в отличие от std::unique_ptr, например) не предоставляет operator[]. Вы должны были бы разыменовать его: (*buffer)[n] = 'a';

Ответ 2

Вам нужна выделенная память для совместного использования? Вместо этого вы можете использовать std::unique_ptr, а std::make_unique, доступный на С++ 14:

auto buffer = std::make_unique<char[]>(64);

В С++ 20 будет доступна версия std::make_shared:

auto buffer = std::make_shared<char[]>(64);

Ответ 3

Как насчет этого?

template<typename T>
inline std::shared_ptr<T> MakeArray(int size)
{
    return std::shared_ptr<T>( new T[size], []( T *p ){ delete [] p; } );
}

auto  buffer = new char[64];
auto  buffer = MakeArray<char>(64);