在C ++ 11中,我只是发现shared_ptr
和unique_ptr
在用于分配数组时看起来有些区别。如果发现正确,我想得到确认。
我必须为<int []>
使用unique_ptr
,但只能为<int>
使用shared_ptr
:
unique_ptr<int []> myUniquePtr = unique_ptr<int[]> ( new int[100]);
shared_ptr<int> mySharedPtr = shared_ptr<int>( new int[100]);
对于unique_ptr
,我不需要重载delete
函子/ lambda函子来指向数组的指针:
unique_ptr<int []> myUniquePtr = unique_ptr<int[]> ( new int[100]); //should be good enough
但我愿意shared_ptr
:
shared_ptr< int> mySharedPtr = shared_ptr<int> ( new int [100], [](const int* p){delete [] p;});
要通过智能指针访问数组中的元素,我可以使用unique_ptr
使用常规方法[index]
,但是不能使用shared_ptr
来做到这一点:
myUniquePtr[10] = 100; // should be OK
但我需要
mySharedPtr.get()[10] = 100;
请您确认以上说法是否正确?在C ++ 14中会有所不同吗?
答案 0 :(得分:3)
template <class T, class Deleter> class unique_ptr<T[], Deleter>
有专门的std::unique_ptr
,可以解释不同的行为。使用数组类型而不是标量类型时,这种特殊化允许不同的行为。
如果您查看How Garbage Collection Really Works,还可以看到只有数组变量实现了operator []
,这使您可以执行3中所述的访问。
如果您在https://en.cppreference.com/w/cpp/memory/unique_ptr上获取文档,则会发现对于T[]
,std::shared_ptr
没有特殊处理。因此,您需要先检索原始指针,然后才能使用“标准”数组访问。另外,它无法决定何时使用delete
和何时使用delete[]
,因此,如果不传递可以由标准删除器删除的对象,则需要提供删除器。
Afaik,C ++ 14中的这种行为没有改变。