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

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

在 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/

相关文章:

c++ - 尝试为 MFC 的 CMap 编写 for_each 算法

c++ - 具有默认移动构造函数的复合类的移动后使用 POD 部分

c++ - 使用 RAW 指针对 boost::shared_ptr 变量进行条件初始化

c++ - 为什么 vector push_back<shared_ptr<T>> 在我定义的类的 for 循环中不起作用

包含 shared_ptr 的 std::list 的 C++ 重载 []

c++ - 如何让英特尔 TBB 库在至强融核上可用

c++ - 操作系统-X : check if process runs from bundle or not

c++ - scanf ("%d", array[i] + 1) 是什么意思?为什么+1在那里?

C++ 复制构造函数基类指针

c++ - 理解#includes C++