buffer = new char[64];
buffer = std::make_shared<char>(char[64]); ???
Вы можете выделить память для массива, используя make_shared<>()
?
Я мог бы сделать: buffer = std::make_shared<char>( new char[64] );
Но это все еще включает вызов нового, это, насколько я понимаю make_shared
безопаснее и эффективнее.
Смысл 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';
Нужна ли выделенная память для совместного использования? Вы можете использовать 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);
Как насчет этого?
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);