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
更安全,更高效。
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
更安全,更高效。
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';
为什么,是的。我从来没有停止学习新的C++ 11技巧... –
虽然我不能在编译时指定数组的大小吗? –
@JoshElias你当然可以在编译时。你的意思是运行时?这将需要您自己的类,它将数组大小作为构造函数参数,因为'make_shared
这个怎么样?
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);
创建新的'shared_ptr'和使用'make_shared'有一个区别,后者的原子操作少一个,只要有可能,它就是首选。 – SagiLow
你需要分配的内存共享?您可以使用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);
'的std ::矢量缓冲液( 64);' –