Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用shared_ptr和unique_ptr指向阵列时的差异?_C++_C++11_Shared Ptr_Unique Ptr - Fatal编程技术网

C++ 使用shared_ptr和unique_ptr指向阵列时的差异?

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]);

在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]);
但我将为
共享\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;