首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

[交流]探讨全局变量的析构顺序解决办法

2012-02-24 
[交流]探讨全局变量的析构顺序前言:最近回答了网友一个问题,当然我不是C++高手,我仅是提出我的猜想和大家

[交流]探讨全局变量的析构顺序
前言:最近回答了网友一个问题,当然我不是C++高手,我仅是提出我的猜想和大家交流。

 

      经典的C++的教科书都这样写着:全局对象在调用   main之前初始化,   在退出main之后析构。但是大家请看下面这样一个程序:

 

#i   nclude   <cstdlib>

#i   nclude   <iostream>

#i   nclude   <conio.h>

using   namespace   std;

 

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()函数,如下:

 

#i   nclude   <cstdlib>

#i   nclude   <iostream>

#i   nclude   <conio.h>

#i   nclude   <stdio.h>

using   namespace   std;

 

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文件里的全局变量的构造和析构顺序,
不同文件间的顺序没有规定。
[解决办法]
以前没注意到过,你的解释很合理^_^
[解决办法]
楼主你试过用vs 2005编译执行你的程序么……

正是因为C++标准没有规定,所以什么样的顺序都是可能的,就像vc 6和devcpp不一致一样,就像vc 6和vc 8不一致一样。
[解决办法]
就是说,任何顺序都是可能的,因为标准中没有规定这个顺序,各个编译器愿意怎么做就怎么做,都是符合标准的。
[解决办法]
quote:C++标准只规定了同一个cpp文件里的全局变量的构造和析构顺序,


不同文件间的顺序没有规定。

大虾,那你怎么解释我的那个程序呢?

-------------------------

gb是你的cpp里的全局
cout 是iostream里的全局

热点排行