制作和访问共享的ptr数组

时间:2015-06-04 21:11:25

标签: c++ arrays

只需快速查询shared_ptr

所以我有这段代码:

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

根据我的理解,我正在创建一个指向10个整数数组的shared_ptr<int>。 如果我的说法是正确的,那么这是我的问题:

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

2.。)是否可以使用make_shared?

3.。)如果我想制作10个shared_ptr的数组并使它们指向单个int怎么办?

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

1 个答案:

答案 0 :(得分:4)

  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不会重载operator[]。您需要获取托管的原始指针并像

    一样使用它
    *(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. 只需从最初的shared_ptr创建一个10 shared_ptr的数组,指向您想要的int

    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管理相同的原始指针,总是一个坏主意。