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

标签 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 行是析构函数的一部分,据我所知,它是在最后一条语句之后调用的。所以我的问题是在什么样的情况下在最后一条语句之前调用析构函数?

最佳答案

对象 C 在函数 f 中创建。因此,Cf 函数范围结束时被销毁,就在调用 main 中的 f(i) 之后,f 作用域被销毁,C 对象的析构函数被调用。

关于C++:什么时候在最后一条语句之前调用析构函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35188833/

相关文章:

c++ - constexpr vector push_back 或如何 constexpr 所有的东西

c++ - winsock 服务器故障排除

.net - 由于 2 秒超时,并非所有 native 全局变量都在混合模式 .Net 应用程序中被破坏

c++ - typedef 别名的析构函数

c# - 在这种情况下什么时候调用我的析构函数? (C#)

c++ - Android 上的 OpenGL 仅使用 C++

c++ - 递归函数计数和打印 1 到 n-1 的分区

c++ - 模板化上下文中的显式析构函数

php - 如果我们想在 __destruct 中使用复杂的代码,我们是否应该尽快取消设置一个类?

c++ - Visual Studio C++ 项目配置中的“调试”和“Unicode 调试”有什么区别?