2012-12-10 23 views
20
buffer = new char[64]; 
buffer = std::make_shared<char>(char[64]); ??? 

您可以使用make_shared<>()为阵列分配内存吗?你能分配一个等同于make_shared的数组吗?

我可以这样做:buffer = std::make_shared<char>(new char[64]);

但仍然需要调用新的,这是我的理解是make_shared更安全,更高效。

+3

'的std ::矢量缓冲液( 64);' –

回答

19

make_shared的点是对管理对象纳入共享指针的控制块,

既然你要处理的C++ 11,多半是使用C++ 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';

+0

为什么,是的。我从来没有停止学习新的C++ 11技巧... –

+0

虽然我不能在编译时指定数组的大小吗? –

+2

@JoshElias你当然可以在编译时。你的意思是运行时?这将需要您自己的类,它将数组大小作为构造函数参数,因为'make_shared '将其运行时参数转发给'T'的构造函数。或者只是制作一个共享矢量。 – Cubbi

1

这个怎么样?

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); 
+0

创建新的'shared_ptr'和使用'make_shared'有一个区别,后者的原子操作少一个,只要有可能,它就是首选。 – SagiLow

2

你需要分配的内存共享?您可以使用std::unique_ptr替代和可在std::make_unique C++ 14:

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

会有在C++ 20可用std::make_shared版本:

auto buffer = std::make_shared<char[]>(64); 
相关问题