gpt4 book ai didi

c++ - 制作和访问共享指针数组

转载 作者:行者123 更新时间:2023-11-30 01:48:08 25 4
gpt4 key购买 nike

关于 shared_ptr 的快速查询:

所以我有这个代码:

std::shared_ptr<int> asd(new int[10]);

据我了解,我正在制作一个 shared_ptr<int>指向一个包含 10 个整数的数组。如果我的理解是正确的,那么这是我的问题:

1.) 我如何访问值/初始化?

2.) 是否可以使用 make_shared?

3.) 如果我想创建一个包含 10 个 shared_ptr 的数组并让它们指向一个 int 怎么办?

我还知道在使用 shared_ptr 处理数组时需要提供自定义删除器。使用 vector 也会使它更容易。

最佳答案

  1. 这是一个非常非常糟糕的主意。您实际上正在创建一个 10 int 数组,但默认删除器使用 delete 而不是 delete[]释放内存。您要么必须指定自定义删除器,

    std::shared_ptr<int> asd(new int[10]{0}, [](int* _p)
    {
    delete[] _p;
    }); // also zero-initializes

    或使用

    std::unique_ptr<int[]> asd(new int[10]{0}); // no need for a deleter here

    相反,因为 unique_ptr 有一个数组特化,删除器使用适当的 delete[] 来进行这个特化。上面的示例零初始化动态分配的数组。如果你想要其他值,那么取消引用指针并设置值,就像你在原始指针情况下所做的那样。要访问 shared_ptr 指向的数组中的值,您不能再使用 arr[j] 语法,因为 shared_ptr 不会重载 运算符[]。您需要获取托管原始指针并像这样使用它

    *(asd.get()+2) // this dereference the third element

    asd.get()[2] // same as above

    如您所见,shared_ptr 并不是真正为数组而设计的。另一方面,unique_ptr 为其托管数组重载了 operator[],因此您可以简单地使用 asd[2] 来引用第三个数组中的元素。

  2. 您不能使用 make_shared,因为 make_shared 不允许您指定删除器。

  3. 简单地从指向您想要的 int

    的初始 shared_ptr 创建一个包含 10 个 shared_ptr 的数组
    std::shared_ptr<int> sp(new int{42});
    std::array<std::shared_ptr<int>, 10> arr_sp;
    for(auto& elem: arr_sp)
    elem = sp;

    不要从同一个原始指针构造数组的所有元素,因为您最终会得到多个管理相同原始指针的shared_ptr指针,这总是一个坏主意。

关于c++ - 制作和访问共享指针数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30654240/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com