对数组的Shared_PTR:应该使用它吗?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (17)

只是一个关于shared_ptr

使用它是一个好的实践吗?shared_ptr指向一个数组?例如,

shared_ptr<int> sp(new int[10]);

如果没有,那为什么不呢?我已经意识到的一个原因是不能增加/减少shared_ptr因此,它不能像指向数组的普通指针一样使用。

提问于
用户回答回答于

默认情况下,shared_ptr会打电话delete在托管对象上,当不再有对其的引用时。但是,当您使用new[]你需要打电话delete[],而不是delete,来释放资源。

为了正确使用shared_ptr使用数组时,必须提供自定义删除器。

template< typename T >
struct array_deleter
{
  void operator ()( T const * p)
  { 
    delete[] p; 
  }
};

创建共享[医]PTR如下:

std::shared_ptr<int> sp( new int[10], array_deleter<int>() );

现在shared_ptr将正确调用delete[]当销毁托管对象时。

如注释中所示,对于C++11,可以使用std::default_delete数组类型的部分专门化而不是array_deleter上面。

std::shared_ptr<int> sp( new int[10], std::default_delete<int[]>() );

您也可以使用lambda表达式而不是函子。

std::shared_ptr<int> sp( new int[10], []( int *p ) { delete[] p; } );

另外,除非您实际需要共享托管对象,否则unique_ptr更适合此任务,因为它对数组类型有部分专门化。

std::unique_ptr<int[]> up( new int[10] ); // this will correctly call delete[]

C++扩展对库基础的更改

shared_ptr正在由库基础技术规范(TS)进行扩展,以便在它拥有一个对象数组的情况下,它可以根据实际情况工作;不需要显式地提供一个删除器。目前的草案shared_ptr为此TS指定的更改.这些更改将通过std::experimental命名空间,并包含在<experimental/memory>头球。几个相关的修改来支持shared_ptr对于数组而言:

-成员类型的定义element_type变化

T元素[医]类型;类型名称删除[医]程度<T>*类型要素[医]类型;

-成员operator[]正在被添加

元素[医]类型与运算符Const no除外;

-不像unique_ptr数组的部分专门化,两者都是shared_ptr<T[]>shared_ptr<T[N]>都是有效的,两者都会导致delete[]在托管对象数组上调用。

模板<class Y>显式共享[医]PTR(Y)*p);要求*Y应该是一个完整的类型。表达delete[] p,何时T是数组类型,或delete p,何时T不是数组类型,应该是格式良好的,应该具有定义良好的行为,并且不应抛出异常。何时TU[N],,,Y(*)[N]可转换为T*;何时TU[],,,Y(*)[]可转换为T*否则,Y*可转换为T*...

用户回答回答于

一个可能更容易使用的替代方案是shared_ptr<vector<int>>.

扫码关注云+社区