C++ 使用shared_ptr和unique_ptr指向阵列时的差异?
在C++11中,我刚刚发现C++ 使用shared_ptr和unique_ptr指向阵列时的差异?,c++,c++11,shared-ptr,unique-ptr,C++,C++11,Shared Ptr,Unique Ptr,在C++11中,我刚刚发现shared_ptr和unique_ptr在用于分配数组时似乎存在一些差异。我想确认一下我的发现是否正确 我必须将用于唯一\u ptr但仅用于共享\u ptr: unique_ptr<int []> myUniquePtr = unique_ptr<int[]> ( new int[100]); shared_ptr<int> mySharedPtr = shared_ptr<int>( new int[100]);
shared_ptr
和unique_ptr
在用于分配数组时似乎存在一些差异。我想确认一下我的发现是否正确
我必须将
用于唯一\u ptr
但
仅用于共享\u ptr
:
unique_ptr<int []> myUniquePtr = unique_ptr<int[]> ( new int[100]);
shared_ptr<int> mySharedPtr = shared_ptr<int>( new int[100]);
但我将为共享\u ptr
:
shared_ptr< int> mySharedPtr = shared_ptr<int> ( new int [100], [](const int* p){delete [] p;});
但我需要
mySharedPtr.get()[10] = 100;
你能确认一下上述陈述是否正确吗?在C++14中会有什么不同吗?不同的行为可以通过以下事实来解释:
std::unique\u ptr
有一个专门的模板类unique\u ptr
。这种专门化允许在使用数组类型而不是标量类型时有不同的行为
如果查看,您还可以看到只有数组变量实现了操作符[]
,这允许您执行第3节中描述的访问
如果您在获取文档,您会发现在std::shared\u ptr
的情况下,T[]
没有特殊处理。因此,在使用“标准”数组访问之前,需要检索原始指针。此外,它无法决定何时使用delete
以及何时使用delete[]
,因此如果您没有传递标准删除器可以删除的对象,则需要提供删除器
好的,在C++14中这种行为没有变化。不同的行为可以通过以下事实来解释:
std::unique\u ptr
有一个专门的模板类unique\u ptr
。这种专门化允许在使用数组类型而不是标量类型时有不同的行为
如果查看,您还可以看到只有数组变量实现了操作符[]
,这允许您执行第3节中描述的访问
如果您在获取文档,您会发现在std::shared\u ptr
的情况下,T[]
没有特殊处理。因此,在使用“标准”数组访问之前,需要检索原始指针。此外,它无法决定何时使用delete
以及何时使用delete[]
,因此如果您没有传递标准删除器可以删除的对象,则需要提供删除器
好的,在C++14中这种行为没有变化。
uinque_ptr
对数组类型有专门的定义,因此它可以在不提供删除器的情况下识别是否需要使用delete
或delete[]
。但是,如果您需要分配一个数组并拥有相应的访问器,则可能需要使用std::vector
或std::array
来代替。您可能需要查找make_unique
和make_shared
uinque_ptr
对数组类型有专门化,因此,在您不提供删除程序的情况下,它可以识别是否需要使用delete
或delete[]
。但是,如果您需要分配一个数组并拥有相应的访问器,则可能需要使用std::vector
或std::array
来代替。您可能需要查找make_unique
和make_shared
。添加了[]
重载,用于添加了共享的ptrC++17[]
使用共享ptr进行阵列访问时过载
myUniquePtr[10] = 100; // should be OK
mySharedPtr.get()[10] = 100;