如何动态分配shared_ptr指向的“n个元素”?
我能够创建一个共享指针指向的静态数组,但我希望用户输入一个数字,然后分配n个元素。
shared_ptr<int[10]> p = make_shared<int[10]>();
答案 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>>());
上述声明可能是正确的吗?
有没有人知道它为什么会调用两次析构函数?
有什么想法吗?