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