关键词搜索

源码搜索 ×
×

C++全局对象的析构函数有时候没有被调用?非也!(编译器为VC++6.0)

发布2013-05-25浏览10695次

详情内容

        说明:以下程序都是在VC++6.0中的结果。

 

        在写程序的时候,我发现一个十分古怪的问题,下面会慢慢道来。原来的程序比较复杂,为了简便起见,只抽出最关键的部分来解释。

        我们首先来看程序:

 

  1. #include <iostream.h>
  2. class Base
  3. {
  4. public:
  5. Base()
  6. {
  7. cout << "Base Constructor" << endl;
  8. }
  9. ~Base()
  10. {
  11. cout << "Base Destructor" << endl;
  12. }
  13. };
  14. int main()
  15. {
  16. Base b;
  17. return 0;
  18. }

     结果为:

 

Base Constructor
Base Destructor

      把main中的局部对方放倒main外面,得到程序:

 

  1. #include <iostream.h>
  2. class Base
  3. {
  4. public:
  5. Base()
  6. {
  7. cout << "Base Constructor" << endl;
  8. }
  9. ~Base()
  10. {
  11. cout << "Base Destructor" << endl;
  12. }
  13. };
  14. Base b;
  15. int main()
  16. {
  17. return 0;
  18. }

      结果为:

 

Base Constructor
Base Destructor

 

       我们知道,在标准C++中,用#include<iostream.h>显得不纯正,下面我们看程序:

 

  1. #include <iostream>
  2. using namespace std;
  3. class Base
  4. {
  5. public:
  6. Base()
  7. {
  8. cout << "Base Constructor" << endl;
  9. }
  10. ~Base()
  11. {
  12. cout << "Base Destructor" << endl;
  13. }
  14. };
  15. int main()
  16. {
  17. Base b;
  18. return 0;
  19. }

      结果为:

 

Base Constructor
Base Destructor

 

       此时,如果将main中的局部对方放在前面,程序的结果会是怎样的呢?程序如下:

  1. #include <iostream>
  2. using namespace std;
  3. class Base
  4. {
  5. public:
  6. Base()
  7. {
  8. cout << "Base Constructor" << endl;
  9. }
  10. ~Base()
  11. {
  12. cout << "Base Destructor" << endl;
  13. }
  14. };
  15. Base b;
  16. int main()
  17. {
  18. return 0;
  19. }

      结果为:(注意,并没有Base Destructor):

 

Base Constructor

      奇怪了,怎么会没有Base Destructor呢?难道全局对象的析构函数没有被调用到?我们继续写程序来测试,程序如下:

 

  1. #include <iostream>
  2. using namespace std;
  3. class Base
  4. {
  5. public:
  6. Base()
  7. {
  8. cout << "Base Constructor" << endl;
  9. }
  10. ~Base()
  11. {
  12. cout << "Base Destructor" << endl;
  13. printf("Base Destructor has been called\n");
  14. }
  15. };
  16. Base b;
  17. int main()
  18. {
  19. return 0;
  20. }

        程序的结果为:

 

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>

 

相关技术文章

点击QQ咨询
开通会员
返回顶部
×
微信扫码支付
微信扫码支付
确定支付下载
请使用微信描二维码支付
×

提示信息

×

选择支付方式

  • 微信支付
  • 支付宝付款
确定支付下载