有关“C++对象析构顺序”的问题

独酌逸醉 2010-10-28 03:16:26
如下代码:

#include <iostream>
using namespace std;

class test_class
{
public:
test_class()
:flag (0)
{
cout << "ctor class" << endl;
}
test_class(int oflag)
:flag (oflag)
{
cout << flag << ",ctor class" << endl;
}
~test_class()
{
cout << flag << ",dtor class" << endl;
}
private:
int flag;
};
static test_class global_c1(1);
static test_class global_c2(2);

int main()
{
test_class global_c3(3);
test_class global_c4(4);
// getchar();
return 0;
}


在VS2008和code::blocks下运行,结果如下:

1,ctor class
2,ctor class
3,ctor class
4,ctor class
4,dtor class
3,dtor class
2,dtor class
1,dtor class

但是在VC6.0下运行,结果如下:

1,ctor class
2,ctor class
3,ctor class
4,ctor class
4,dtor class
3,dtor class

而且,在某大学C++教科书中指出“C++全局对象析构顺序和建造顺序相同,而局部对象则相反”。那么C++全局对象析构顺序到底是什么样呢?
...全文
230 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq120848369 2010-10-28
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 frankhb1989 的回复:]
析构顺序应该一样,看起来只是退出main以后的运行库清理顺序的问题,部分实现在析构全局和函数外静态对象之前就把管标准输出的CRT给卸了,于是stdout的输出就被吃了。
[/Quote]!!!!!!!!!!!
FrankHB1989 2010-10-28
  • 打赏
  • 举报
回复
析构顺序应该一样,看起来只是退出main以后的运行库清理顺序的问题,部分实现在析构全局和函数外静态对象之前就把管标准输出的CRT给卸了,于是stdout的输出就被吃了。
ningto.com 2010-10-28
  • 打赏
  • 举报
回复
看具体编译器,具体程序,按照一般的话先构造父类然后构造子类, 先析构子类然后析构父类。
lixing01 2010-10-28
  • 打赏
  • 举报
回复
#include <windows.h>
#include <iostream>
using namespace std;

class test_class
{
public:
test_class()
:flag (0)
{
cout << "ctor class" << endl;
}
test_class(int oflag)
:flag (oflag)
{
cout << flag << ",ctor class" << endl;
}
~test_class()
{
cout << flag << ",dtor class" << endl;
char ch[32];
::MessageBox(NULL, itoa(flag, ch, 10), NULL, 0); //可见VC6下析构循序和VS2008一样
}
private:
int flag;
};
static test_class global_c1(1);
static test_class global_c2(2);

int main()
{
test_class global_c3(3);
test_class global_c4(4);
// getchar();
return 0;
}
harderman 2010-10-28
  • 打赏
  • 举报
回复
我是来学习的
gules 2010-10-28
  • 打赏
  • 举报
回复
对于同一编译单元的全局静态对象,C++保证其构造顺序为其定义顺序(且在main函数之前),那么析构顺序(程序结束时)与构造顺序相反;
对于不同的编译单元,C++没有定义其不同编译单元中的全局对象构造顺序,但析构顺序依然与其构造顺序(编译前我们无法知道,但编译后这种顺序就确定了)相反。
shenchenman 2010-10-28
  • 打赏
  • 举报
回复
全局对象析构同样也是在main函数结束时进行出栈的,和局部对象析构顺序肯定是相同啊
luciferisnotsatan 2010-10-28
  • 打赏
  • 举报
回复
这个具体还是要看编译器的吧。

64,664

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧