只需快速查询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处理数组时需要提供自定义删除器。使用矢量也可以使它更容易。
答案 0 :(得分:4)
这是一个非常糟糕的主意。您确实创建了一个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]
来引用数组中的第三个元素。
您无法使用make_shared
,因为make_shared
不允许您指定删除者。
只需从最初的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
管理相同的原始指针,总是一个坏主意。