说我有一个像
这样的课程class A {
public: // I know, I know...
shared_ptr<string> aString;
};
我是否必须拥有像
这样的析构函数~A() {
aString.reset();
}
确保所有权得到妥善保释?我做了一些测试,似乎我没有 - 也就是说,当A的实例超出范围或被删除(或重置,如果我通过shared_ptr引用它)时,字符串也会被删除(我用一个更复杂的例子来证实这一点)。但是,这可能是我正在使用的编译器特有的实现(clang-700.0.72)。
我的问题是:这总是如此,或者明确重置这些实例更好,就像删除任何其他哑指针一样?
答案 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)
没有。这是明确定义的,没有我知道的编译器错误。