C++:在最后一个语句之前调用析构函数的时间

C++: When is a destructor called before the last statement?

本文关键字:调用 析构函数 时间 最后一个 语句 C++      更新时间:2023-10-16

所以我有一些C++代码:

#include <iostream>
using namespace std;
class C {
public:
    C() {i = 9; cout << "C0:" << i << endl;}
    C(int i0) {i = i0; cout << "C1:" << i << endl;}
    ~C() {cout << "C2:" << i << endl;}
private:
    int i;
};
void f(int i) {
    C c(i);
}
int main(int argc, char* argv[]) {
    for (int i  = 0; i < 1; i++) {
        cout << "X" << endl;
        f(i);
        cout << "Y" << endl;
    }
}

输出为:

X
C1:0
C2:0
Y

这很奇怪,因为行 C2:0是我学到的析构函数的一部分,在最后一个语句之后调用。所以我的问题是在最后一条语句之前在什么样的情况下调用析构函数?

对象C是在函数f中创建的。因此,当f函数作用域结束时,C被销毁,只需在 main 中调用f(i)之后,f作用域将被销毁,并调用C对象的析构函数。

自动变量(您的cf() 中),当它们所在的堆栈消失时,会清理它们。

因此,在这种情况下,就像您的f(i)呼叫返回一样。 对于对象,这包括调用析构函数。

全局变量和静态变量也会在程序退出时清理,当它正确退出时。 如果它通过未捕获的异常退出,则可能不会清理它们(这不是必需的)。

这很奇怪,因为行 C2:0是我学到的析构函数的一部分,在最后一个语句之后调用。

析构函数在包含变量的作用域的最后一条语句之后调用,该变量是类的实例。

C

f(int i) 函数的范围内创建和销毁,因此 C 的析构函数打印 "C2:0"。f 完成,然后才打印 Y。