shared_ptr到一个数组

时间:2017-07-06 13:31:51

标签: c++ c++11

如何动态分配shared_ptr指向的“n个元素”?

我能够创建一个共享指针指向的静态数组,但我希望用户输入一个数字,然后分配n个元素。

shared_ptr<int[10]> p = make_shared<int[10]>();

4 个答案:

答案 0 :(得分:18)

您应该像那样<{p>}创建shared_ptr

std::shared_ptr<int> sp( new int[10], std::default_delete<int[]>() );

您必须向shared_ptr

提供其他删除者

你不能使用std::make_shared,因为该函数只提供1个参数,对于数组上的创建指针,你也必须创建删除器。

或者您也可以使用(例如在注释中,使用数组或使用带有自己删除函数的向量)

std::shared_ptr<std::array<int,6>> ptr(std::make_shared<std::array<int, 6>>(std::array<int, 6>()));

如何获得特定元素? 像那样

std::shared_ptr<int> sp(new int[10], std::default_delete<int[]>());
sp.get()[0] = 5;
std::cout << sp.get()[0] << std::endl;

答案 1 :(得分:5)

该语言目前缺乏使用make_shared来完成此任务的能力。它在P0674中得到了解决。很确定它会进入语言,虽然它不会成为C ++ 11。

措辞可以让你说

auto p = std::make_shared<int[10]>()

auto p = std::make_shared<int[]>(10)

在C ++ 20之前(或者当提案正式标准化时),您仍然坚持使用21koizyd's answer中链接的new语法。

答案 2 :(得分:0)

我认为这个问题更好的是unique_ptr模板。

int amount = 10;
std::unique_ptr<int[]> name(new int[amount]);

答案 3 :(得分:0)

我发现下面的表格错了。

std::shared_ptr<std::array<int,6>> ptr(std::make_shared<std::array<int, 6>>(std::array<int, 6>()));

它调用两次析构函数。

如果您的输入不是本机类型(如int),则会导致崩溃。

可以尝试一下。

std::shared_ptr<std::array<int,6>> ptr(std::make_shared<std::array<int, 6>>());

上述声明可能是正确的吗?

有没有人知道它为什么会调用两次析构函数?

有什么想法吗?