Можете ли вы выделить массив с чем-то эквивалентным 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 безопаснее и эффективнее.

20

Решение

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

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

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

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

20

Другие решения

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

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

Там будет std::make_shared версия доступна на C ++ 20:

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

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

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);
2
По вопросам рекламы [email protected]