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

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

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

但这仍然涉及调用 new,据我了解,它make_shared更安全、更有效。

4

4 回答 4

27

make_shared 的要点是将托管对象合并到共享指针的控制块中,

由于您正在处理 C++11,也许使用 C++11 数组可以满足您的目标?

#include <memory>
#include <array>
int main()
{
    auto buffer = std::make_shared<std::array<char, 64>>();
}

请注意,您不能以与从 new[] 获得的指针相同的方式使用共享指针,因为std::shared_ptrstd::unique_ptr例如,与 不同)不提供operator[]. 你必须取消引用它:(*buffer)[n] = 'a';

于 2012-12-10T03:16:30.043 回答
27

您需要共享分配的内存吗?您可以使用 astd::unique_ptr而不是std::make_uniqueC++14 上的可用:

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

在 C++20中将有一个std::make_shared可用的版本:

auto buffer = std::make_shared<char[]>(64);
于 2017-11-09T12:45:47.213 回答
5

这个怎么样?

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);
于 2016-05-26T03:08:03.970 回答
0

最有效的方法是使用make_shared()下面的重载,它在 Boost 和 C++20 中可用。

template< class T >
shared_ptr<T> make_shared( std::size_t N );
于 2022-01-10T19:21:26.883 回答