探讨全局变量的析构顺序

3146人阅读 评论(2) 收藏 举报
                                                                        朱金灿
 
前言:最近回答了网友一个问题,当然我不是C++高手,我仅是提出我的猜想和大家交流。
 
   经典的C++的教科书都这样写着:全局对象在调用 main之前初始化, 在退出main之后析构。但是大家请看下面这样一个程序:
 
#include <cstdlib>
#include <iostream>
#include <conio.h>
 
class gb
{
public:
gb::gb()
{
std::cout<<"start"<<std::endl;
};
 
gb::~gb()
{
std::cout<<"end"<<std::endl;
getch();
};
};
 
gb a;
 
int main()
{
std::cout<<"This is in main"<<std::endl;
return 0;
}
 
     大家认为输出是什么呢?大家可能会说:这不是很简单吗?
Start
This is in main
End
 
      实际上事情并没有这么简单。在dev-c++-4.9.9.2的工程上,输出结果是顺理成章的:
Start
This is in main
End
在VC6.0上建一个控制台工程,把代码拷贝进去,发现运行结果却是:
Start
This is in main

     当时很感疑惑,难道gb类对象a没有执行析构函数?思考了一会,决定试验一下。把代码稍为修改一下,把cout全部换为C语言的printf()函数,如下:
 
#include <cstdlib>
#include <iostream>
#include <conio.h>
#include <stdio.h>
 
class gb
{
public:
gb::gb()
{
//std::cout<<"start"<<std::endl;
printf("start/n");
};
 
gb::~gb()
{
// std::cout<<"end"<<std::endl;
printf("end/n");
getch();
};
};
 
gb a;
 
int main()
{
std::cout<<"This is in main"<<std::endl;
return 0;
}
 
运行结果是:
Start
This is in main
End
 
 这说明析构函数是有执行的。下面提出我的一个猜想:cout作为一个iostream类的对象,在退出main函数后比gb类对象a先执行析构函数,故无法输出End。值得注意这种全局变量的析构顺序是和编译器相关的,在VC上是cout ——〉gb a,而在dev-c++-4.9.9.2是gb a——〉cout。实际上C++标准只规定了同一个cpp文件里的全局变量的构造和析构顺序,
不同文件间的顺序没有规定,因为 gb a是我的cpp里的全局变量 ,cout是iostream里的全局变量,就是说,因为标准中没有规定它们的析构顺序,各个编译器愿意怎么做就怎么做,都是符合标准的。
 
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:3841181次
    • 积分:43381
    • 等级:
    • 排名:第79名
    • 原创:749篇
    • 转载:80篇
    • 译文:3篇
    • 评论:2419条
    公告


    真名:朱金灿
    主要经历:本科毕业于CUG(武汉)的GIS专业,毕业后参加工作,现在在北京从事软件开发和团队管理工作。曾获有色金属工业科技进步奖二等奖(获奖证书链接)。
    我的联系方式:
    EMAIL:clever101#163.com
    研究方向:
    数字图像处理、计算机图形学。

    本博客内容除非特殊说明均属原创,如需转载、引用其中的部分文字,请注意以下几点:

    1)如果我的博客侵犯了你的版权,请给我邮件:clever101#163.com,经核实后我会做出合适的处理。

    2)请在转载(引用)的内容提供本博客中相应文章的链接。如你的作品为非电子读物或纯文本,请给出链接的url。

    3)请勿将我的原创文章用于商业用途。

    4)如果愿意,请给我邮件:clever101#163.com,让我知道我的东西到哪去了。谢谢!

    5)我可以尽我所能回复你在评论中提到的问题,但一般不会给你发邮件,所以请勿留邮箱地址.

    文章存档
    最新评论