C++:在最后一个语句之前调用析构函数的时间
C++: When is a destructor called before the last statement?
所以我有一些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
对象的析构函数。
自动变量(您的c
在 f()
中),当它们所在的堆栈消失时,会清理它们。
因此,在这种情况下,就像您的f(i)
呼叫返回一样。 对于对象,这包括调用析构函数。
全局变量和静态变量也会在程序退出时清理,当它正确退出时。 如果它通过未捕获的异常退出,则可能不会清理它们(这不是必需的)。
这很奇怪,因为行 C2:0是我学到的析构函数的一部分,在最后一个语句之后调用。
析构函数在包含变量的作用域的最后一条语句之后调用,该变量是类的实例。
C
在f(int i)
函数的范围内创建和销毁,因此 C 的析构函数打印 "C2:0"。f 完成,然后才打印 Y。
相关文章:
- 什么时候调用析构函数
- C++-明确何时以及如何调用析构函数
- C++ 防止在映射中放置()时调用析构函数
- 调用析构函数以释放动态分配的内存
- C++:使用方法调用析构函数的顺序是什么?
- 向量推回调用析构函数时调用析构函数
- 如何在调用析构函数时优雅地停止/销毁带有阻塞调用C++线程?
- C++,我应该调用析构函数吗?
- 如何获取有关在 Clang LibTooling 中调用析构函数的信息?
- 当我从 std::vector 中的新放置调用析构函数时会发生什么?
- 为什么这里不调用析构函数
- 在调用 std::bind 的产品后意外调用析构函数
- 为什么在传递给函数而不是构造函数时调用析构函数?
- 如何在C++中调用析构函数
- 为什么为未删除的对象调用析构函数?
- 调用析构函数时出错
- C++ 在不释放内存的情况下调用析构函数
- 为什么在运算符删除中不调用析构函数?
- C++ 调用析构函数后动态模板队列"double free or corruption (out)"
- 在 postOrderDelete 上调用析构函数时引发的异常