你能分配一个与make_shared等效的数组吗?

时间:2012-12-10 03:06:00

标签: c++ c++11 shared-ptr make-shared

buffer = new char[64];
buffer = std::make_shared<char>(char[64]); ???

您可以使用make_shared<>()为数组分配内存吗?

我能做到:buffer = std::make_shared<char>( new char[64] );

但这仍然涉及到调用new,这是我的理解make_shared更安全,更有效。

3 个答案:

答案 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);