在 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
functor/lambda func 用于指向数组的指针:
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 中会有什么不同吗?
最佳答案
不同的行为可以解释为有一个特化 template <class T, class Deleter> class unique_ptr<T[], Deleter>
对于 std::unique_ptr
.当使用数组类型而不是标量类型时,这种特化允许不同的行为。
如果你看https://en.cppreference.com/w/cpp/memory/unique_ptr ,您还可以看到只有数组变体实现了 operator []
,它允许您执行 3. 中描述的访问。
如果您在 https://de.cppreference.com/w/cpp/memory/shared_ptr 获取文档,您会看到 T[]
没有特殊处理如果是 std::shared_ptr
.因此,您需要先检索原始指针,然后才能使用“标准”数组访问。此外,它无法决定何时使用 delete
什么时候delete[]
,所以如果你不传递一个可以被标准删除器删除的对象,你需要提供一个删除器。
Afaik,此行为在 C++14 中没有变化。
关于c++ - 使用 shared_ptr 和 unique_ptr 指向数组时的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52130056/