【发布时间】:2019-02-07 08:21:33
【问题描述】:
在 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 中会有什么不同吗?
【问题讨论】:
-
uinque_ptr具有对数组类型的专门化,因此它可以在不提供删除器的情况下判断是否需要使用delete或delete[]。但是,如果您需要分配一个数组并拥有相应的访问器,您可能希望使用std::vector或std::array。 -
您可能需要查找
make_unique和make_shared。
标签: c++ c++11 shared-ptr unique-ptr