使用shared_ptr和unique_ptr指向数组时的区别?

时间:2018-09-01 16:24:46

标签: c++ c++11 shared-ptr unique-ptr

在C ++ 11中,我只是发现shared_ptrunique_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中会有所不同吗?

1 个答案:

答案 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中的这种行为没有改变。