gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:28:24 24 4
gpt4 key购买 nike

问题

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 处于那种状态时访问它甚至合法吗?

最佳答案

对我来说,从 [12.4] 可以清楚地看出,这是不合法的:

Once a destructor is invoked for an object, the object no longer exists; the behavior is undefined if the destructor is invoked for an object whose lifetime has ended (3.8). [Example: ...]

尽管缺少不再存在的定义,但我认为,我可以说引用一个不再存在的对象会导致未定义的行为 .

关于c++ - 调用 ~Derived() 和 ~Base() 之间的对象状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11235357/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com