C ++:什么时候在最后一个语句之前调用析构函数?

时间:2016-02-03 22:16:03

标签: c++ destructor

所以我有一些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行是析构函数的一部分,我学到的是在最后一个语句之后调用的。所以我的问题是在最后一个陈述之前调用析构函的情况是什么?

4 个答案:

答案 0 :(得分:1)

在函数f中创建对象C。因此,当C函数范围结束时,f被销毁,只需在main中调用f(i)f范围被销毁,以及C对象的析构函数被称为。

答案 1 :(得分:0)

当他们所在的堆栈消失时,自动变量(c中的f())会被清除。

因此,在这种情况下,您的f(i)来电正在返回。对于对象,这包括调用析构函数。

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

答案 2 :(得分:0)

  

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

在包含变量的范围的最后一个语句之后调用析构函数。该变量是类的实例。

答案 3 :(得分:0)

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