shared_ptr to an array

shared_ptr to an array

本文关键字:an array to ptr shared      更新时间:2023-10-16

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

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

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

你应该像这样创建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;

该语言目前缺乏使用make_shared来实现此目的的能力。它在P0674中得到解决。很确定它会进入语言,尽管它不会是C++11。

措辞将允许你说

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

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

直到C++20(或每当提案正式标准化时),您都坚持使用21koizyd答案中链接的new语法。

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

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

我发现下面的表格是错误的。

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>>());

也许上面的说法是正确的?

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

有什么想法吗?