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

Jos*_*ias 24 c++ shared-ptr make-shared c++11

buffer = new char[64];
buffer = std::make_shared<char>(char[64]); ???
Run Code Online (Sandbox Code Playgroud)

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

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

但这仍然涉及呼唤新的,这是我的理解make_shared更安全,更有效.

Cub*_*bbi 23

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

既然你正在处理C++ 11,那么使用C++ 11数组可能会满足你的目标吗?

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

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

  • @JoshElias你肯定可以在编译时.你的意思是运行时?这需要你自己的类,它将数组大小作为构造函数参数,因为`make_shared <T>`将其运行时参数转发给`T`的构造函数.或者只是制作一个共享的矢量. (2认同)
  • 为获得见识而投票,但是您应该知道,make_shared不适合过早的优化;这也是为了异常安全。`std :: shared_ptr &lt;T&gt;(new T)`是一个危险信号,因为如果`shared_ptr`的构造函数碰巧抛出`bad_alloc`异常,它将泄漏`new T`。 (2认同)

Myo*_*yon 11

您是否需要分配已分配的内存?您可以使用C++ 14上的std::unique_ptr替代和std::make_unique可用:

auto buffer = std::make_unique<char[]>(64);
Run Code Online (Sandbox Code Playgroud)

std::make_sharedC++ 20 中将提供一个版本:

auto buffer = std::make_shared<char[]>(64);
Run Code Online (Sandbox Code Playgroud)

  • 即使您确实希望共享它, `make_unique` 也会工作 `std::shared_ptr&lt;char[]&gt; b; b = std::make_unique&lt;char[]&gt;(25);` (2认同)

Toy*_*r X 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);
Run Code Online (Sandbox Code Playgroud)

  • 创建新的 `shared_ptr` 和使用 `make_shared` 是有区别的,后者少了 1 个原子操作,并且在任何可能的情况下都是首选。 (3认同)