buffer = new char[64];
buffer = std::make_shared<char>(char[64]); ???
您可以使用make_shared<>()
为数组分配内存吗?
我能做到:buffer = std::make_shared<char>( new char[64] );
但这仍然涉及到调用new,这是我的理解make_shared
更安全,更有效。
答案 0 :(得分:22)
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
不同)不提供{{ 1}}。您必须取消引用它:operator[]
答案 1 :(得分:9)
您是否需要分配已分配的内存?您可以使用std::unique_ptr
代替C ++ 14上提供的std::make_unique
:
auto buffer = std::make_unique<char[]>(64);
C ++ 20中将提供std::make_shared
版本:
auto buffer = std::make_shared<char[]>(64);
答案 2 :(得分:2)
这个怎么样?
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);