我是否必须在自己的析构函数中手动重置shared_ptrs?

时间:2015-10-12 11:57:02

标签: c++ c++11 destructor shared-ptr

说我有一个像

这样的课程
class A {
public: // I know, I know...
    shared_ptr<string> aString;
};

我是否必须拥有像

这样的析构函数
~A() {
    aString.reset();
}

确保所有权得到妥善保释?我做了一些测试,似乎我没有 - 也就是说,当A的实例超出范围或被删除(或重置,如果我通过shared_ptr引用它)时,字符串也会被删除(我用一个更复杂的例子来证实这一点)。但是,这可能是我正在使用的编译器特有的实现(clang-700.0.72)。

我的问题是:这总是如此,或者明确重置这些实例更好,就像删除任何其他哑指针一样?

3 个答案:

答案 0 :(得分:7)

不,你不需要这样做。作为普通析构函数的一部分,该类的每个成员将依次销毁。智能指针的析构函数将负责必要的记帐,在这种情况下是一个隐式reset

答案 1 :(得分:4)

不,这是智能指针的要点:自动管理内存

shared_ptr的析构函数会自动减少引用计数,如果它达到0,则会调用删除者。

如果您不提供析构函数,则会生成默认值:

  

§12.4.4如果一个类没有用户声明的析构函数,则析构函数被隐式声明为默认值

破坏你的班级将保证会员被毁。

  

§12.4.8执行析构函数体并销毁正文中分配的任何自动对象后,类X的析构函数调用X的直接非变量非静态数据成员的析构函数(...)

反过来shared_ptr意味着:

  

§20.8.2.2.2.1

     

~shared_ptr();

     

效果:

     
      
  • 如果*为空或与另一个shared_ptr实例共享所有权(use_count()&gt; 1),则没有副作用。

  •   
  • 否则,如果*拥有对象p和删除者d,则调用d(p)。

  •   
  • 否则,*它拥有一个指针p,并调用delete p。

  •   

此行为很好地概括为The Rule Of Zero

答案 2 :(得分:2)

没有。这是明确定义的,没有我知道的编译器错误。