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

Mor*_*eu5 1 c++ destructor shared-ptr c++11

说我喜欢上课

class A {
public: // I know, I know...
    shared_ptr<string> aString;
};
Run Code Online (Sandbox Code Playgroud)

我必须要像这样的析构函数

~A() {
    aString.reset();
}
Run Code Online (Sandbox Code Playgroud)

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

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

don*_*mus 7

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


Bar*_*icz 5

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

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

如果不提供析构函数,则将生成默认的析构函数:

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

班级的破坏将保证成员的破坏。

第12.4.8节执行析构函数的主体并销毁主体中分配的所有自动对象后,类X的析构函数调用X的直接非变量非静态数据成员的析构函数(...)

反过来shared_ptr意味着:

第20.8.2.2.2.1条

~shared_ptr();

效果:

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

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

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

这种行为很好地概括为“零规则”

  • 是名称调用然后编辑您的帖子以合并他们接受的StackOverflow表单吗? (3认同)