C++全局对象的析构函数有时候没有被调用?非也!(编译器为VC++6.0)
来源:互联网 发布:java xpath html 编辑:程序博客网 时间:2024/06/06 20:19
说明:以下程序都是在VC++6.0中的结果。
在写程序的时候,我发现一个十分古怪的问题,下面会慢慢道来。原来的程序比较复杂,为了简便起见,只抽出最关键的部分来解释。
我们首先来看程序:
#include <iostream.h>class Base{public:Base(){cout << "Base Constructor" << endl;}~Base(){cout << "Base Destructor" << endl;}};int main(){Base b;return 0;}结果为:
Base Constructor
Base Destructor
把main中的局部对方放倒main外面,得到程序:
#include <iostream.h>class Base{public:Base(){cout << "Base Constructor" << endl;}~Base(){cout << "Base Destructor" << endl;}};Base b;int main(){return 0;}结果为:
Base Constructor
Base Destructor
我们知道,在标准C++中,用#include<iostream.h>显得不纯正,下面我们看程序:
#include <iostream>using namespace std;class Base{public:Base(){cout << "Base Constructor" << endl;}~Base(){cout << "Base Destructor" << endl;}};int main(){Base b;return 0;}结果为:
Base Constructor
Base Destructor
此时,如果将main中的局部对方放在前面,程序的结果会是怎样的呢?程序如下:
#include <iostream>using namespace std;class Base{public:Base(){cout << "Base Constructor" << endl;}~Base(){cout << "Base Destructor" << endl;}};Base b;int main(){return 0;}结果为:(注意,并没有Base Destructor):
Base Constructor
奇怪了,怎么会没有Base Destructor呢?难道全局对象的析构函数没有被调用到?我们继续写程序来测试,程序如下:
#include <iostream>using namespace std;class Base{public:Base(){cout << "Base Constructor" << endl;}~Base(){cout << "Base Destructor" << endl;printf("Base Destructor has been called\n");}};Base b;int main(){return 0;}程序的结果为:
Base Constructor
Base Destructor has been called
可见,全局对象的析构函数的确被调用了,但是,为什么没有输出Base Destructor呢?可以这样认为:全局对象的析构函数是在main函数结束后被调用,而cout对象在全局对象析构之前已经被析构,所以cout便没有相应的作用了。
当然,这种现象并不是语言层面的特性,而是跟编译器的具体实现有关。大家可以在更高级的VS版本中进行测试,得到的结果与VC++6.0中得到的结果并不一致。
总之,在VC++6.0中,如果用到了#include<iostream>和using namespace std; 那么,全局对象的比cout对象更先构造,更后析构。
建议:在VC++6.0中,如果存在全局对象,那么,在类的析构函数中,强烈建议使用printf来代替cout. 当然,你也可以把#include<iostream>和using namespace std; 换成别扭的#include<iostream.h>
- C++全局对象的析构函数有时候没有被调用?非也!(编译器为VC++6.0)
- C/C++ 调用 Lua 函数(非全局函数)
- C/C++ 调用 Lua 函数(非全局函数)
- 晒晒C++:虚函数的真相(VC编译器如何实现“virtual ”规则)(转载的非原创)
- js有时候方法没有被调用的原因
- 非const对象也可以调用const成员函数
- 非const对象也可以调用const成员函数
- 全局对象构造函数的调用时机
- 非全局的函数
- VC6.0上编译的程序使用不调用全局对象的析构函数
- 为什么构造函数不可以被声明为虚函数而析构函数有时候必须声明为虚函数
- 全局对象和函数内静态对象调用构造析构函数差异
- 全局对象和函数内静态对象调用构造析构函数差异
- this指针指向当前调用对象,只是用于类的非静态成员函数。静态函数和全局函数 无当前对象,无this指针。
- 建立全局和局部对象时,不同的构造函数和析构函数的调用顺序
- 几款好的C/C++编译器(编译器而非IDE)
- C++的全局对象,静态对象构造函数是怎样被调用的
- C Runtime 链接库不匹配导致全局静态对象没有析构
- 面试复习==内功心法(二)?值传递or引用:进则变 出则还原
- 由三目运算符想出的PHP改进建议
- Git详解之五 分布式Git
- 关于IO 完成 端口的 一些 困惑
- C语言中堆和栈的区别
- C++全局对象的析构函数有时候没有被调用?非也!(编译器为VC++6.0)
- Archlinux上fcitx怎麼才能輸入正體中文
- 1096最小生成树
- The Android University ACM Team Selection Contest
- 省赛2D题
- 在linux-2.6.33.5内核中添加对s3c2410串口2的配置
- undefined reference to错误的解决方法
- fstab修改有误导致无法启动的解决方法
- J2EE (三) Filter详解