调用 ~Derived() 和 ~Base() 之间对象的状态

2023-12-21

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(使用前将#替换为@)

调用 ~Derived() 和 ~Base() 之间对象的状态 的相关文章

随机推荐