【发布时间】:2012-06-29 10:12:09
【问题描述】:
问题
C++ 标准对对象在时间中的状态有什么保证 在派生类的析构函数执行之后,但在基类的析构函数执行之前? (这是调用派生类的子对象的析构函数的时间。)
示例
#include <string>
struct Base;
struct Member {
Member(Base *b);
~Member();
Base *b_;
};
struct Base {
virtual void f() {}
virtual ~Base() {}
};
struct Derived : Base {
Derived() : m(this) {}
virtual ~Derived() {}
virtual void f() {}
std::string s;
Member m;
};
Member::Member(Base *b) : b_(b) {}
Member::~Member() {
// At this point, ~Derived has finished -- can we use b_ as a
// Derived* object (i.e. call Derived::f or access Derived::s)?
b_->f();
}
int main() {
Base *bd = new Derived;
delete bd;
}
在此示例中,Member 对象有一个指向拥有它的 Derived 对象的指针,并且它尝试访问该 Derived 对象,因为它已被破坏......即使 Derived 的析构函数已经结束了。
如果某个子对象在~Derived() 执行之后、~Base() 执行之前调用虚函数,会调用*bd 的哪个版本的虚函数? *bd 处于那种状态时访问它是否合法?
【问题讨论】:
-
我无法背诵规范中涵盖此内容的部分,但请问问自己;从实际的角度来看,它完全是个好主意吗?可能不会。
-
+1 表示完整的安全带。
标签: c++ destructor object-lifetime