Question
C++ 标准对对象当时的状态有何保证
在派生类的析构函数执行之后,但在基类的析构函数执行之前? (这是调用派生类的子对象的析构函数的时间。)
Example
#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
对象有一个指向a的指针Derived
拥有它的对象,并且它尝试访问该对象Derived
对象被破坏时...即使析构函数为Derived
已经完成了。
哪个版本的*bd
如果某个子对象在之后调用了虚函数,则将调用 的虚函数~Derived()
执行,但之前~Base()
执行?访问是否合法*bd
当它处于那种状态时?
对我来说,从[12.4]来看,它显然是不合法的:
一旦为对象调用析构函数,该对象就不再
存在;如果析构函数被调用,则行为是未定义的
生命周期已结束的对象 (3.8)。 [例子: ...]
尽管缺乏定义不复存在,我想,我可以说引用一个对象不复存在结果是未定义的行为.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)