C++中的析构函数允许做什么

What is allowed to do in destructors in C++?

本文关键字:许做 什么 析构函数 C++      更新时间:2024-09-29

我正在努力理解析构函数中允许做什么。

标准规定:;对于具有非平凡析构函数的对象,在析构函数完成执行后引用对象的任何非静态成员或基类会导致未定义的行为">
cppreference是这样描述销毁序列的:"对于用户定义的或隐式定义的析构函数,在执行析构函数体之后,编译器为类"的所有非静态非变体成员调用析构函数;。

这是否意味着,在下面的代码中,从其成员的析构函数调用方法是UB?或者通过";参考";标准意味着什么特别的东西?

struct Foo {
Foo(Callback cb) : cb_(cb) {}
~Foo() {
// body of Bar destructor finished at this moment;
// cb_() calls Bar::call_me()
cb_();
}
Callback cb_;
};
struct Bar {
// pass callback with captured this
Bar() : foo_([this]() { call_me(); }) {
}
void call_me() {
}
// foo is a member, its destructor will be called after Bar destructor
Foo foo_;
};

此外,短语";在析构函数结束之后;确切地说是标准均值?销毁器的主体完成后?还是在所有成员和基类都被销毁之后
我认为最后一个问题的答案是理解什么是允许的,什么是不允许的关键。

Bar的析构函数尚未完成,因此引用Bar的一个成员,并在其析构函数中调用Bar的一个会员函数是可以的。

调用超级对象的成员函数可能有点不稳定,因为成员函数可能会访问子对象,并且在调用成员函数时,一些子对象可能已经被破坏,在这种情况下,访问被破坏的对象将导致未定义的行为。你的例子并非如此。

或者通过";参考";标准意味着什么特别的东西?

我认为这意味着形成一个子对象的指针或引用。正如下面的例子中所做的那样。


此外,短语";在析构函数结束之后;确切地说是标准均值?销毁器的主体完成后?还是在所有成员和基类都被销毁之后?

后者。

首先执行主体,然后析构函数调用子对象析构函数,然后析构函数完成。