| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 374 人关注过本帖
标题:to: yuanhong——为什么析构函数的cout不输出呢(释放的为全局变量)(回复 ...
只看楼主 加入收藏
cdutli
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2007-10-28
收藏
 问题点数:0 回复次数:0 
to: yuanhong——为什么析构函数的cout不输出呢(释放的为全局变量)(回复还得另开
我也碰到过类似问题,已解决

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

呵呵,可能是编译器问题吧,我用的是VC6.0,
---------------------
编译器也没有错,cout也是一个C++对象;所以如果cout的析构函数在clsTest A的析构函数之前调用,结果当然有问题了。
C++标准没有规定各全局变量析构函数调用的顺序,所以程序最终的行为无论是那一种,都没有错
---------------------
详细讨论如下:原文地址:http://topic.csdn.net/t/20020423/01/668317.html
问题内容:为何析构函数中的cout不起作用
在我说明问题之前,请看程序:

#include <stdio.h>
#include <iostream>

using namespace std;

class clsTest
{
private:
char szTag;
public:
clsTest(char Tag):szTag(Tag)
{
cout << "class clsTest by Tag:" << szTag << " Constructor call" << endl;
};

~clsTest()
{
//printf("class clsTest by tag: %c Destructor call\n",szTag);
cout << "class clsTest by Tag:" << szTag << " Destructor call" << endl;
};
};

static clsTest a('A');

int main(int argc, char* argv[])
{
cout <<"inside main" << endl;

cout <<"leaving main" << endl;
return 0;
}

我认为输出结果是:

class clsTest by Tag:A Constructor call
inside main
leaving main
class clsTest by Tag:A Destructor call

但实际的输出是:
class clsTest by Tag:A Constructor call
inside main
leaving main

但如果将 clsTest 的析构函数的 cout 用法该为 printf ,就能得到我想要的结果,请问问题出在哪里?如果我在析构函数中仍然想用 cout 应如何解决。
---------------------------------------------------------------

原因是cout在你的a之前被destruct掉。有的操作系统允许你设global的destruction顺序。
---------------------------------------------------------------

我用BCB4得到的:
class clsTest by Tag:A Constructor call
inside main
leaving main
class clsTest by Tag:A Destructor call


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

我用linux下的gcc编译器,得到正常结果!你的编译器有问题!
---------------------------------------------------------------

编译器也没有错,cout也是一个C++对象;所以如果cout的析构函数在clsTest A的析构函数之前调用,结果当然有问题了。
C++标准没有规定各全局变量析构函数调用的顺序,所以程序最终的行为无论是那一种,都没有错
---------------------------------------------------------------

把 static clsTest a('A');改为 clsTest a('A');
并放到main()里面即可得到你想要的结果:
int main(int argc, char* argv[])
{

cout <<"inside main" << endl;

cout <<"leaving main" << endl;
return 0;
}

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

不知道什么原因我的回复不见了。

原因是a和cout的析构顺序。在UNIX上有可能让你保证你的顺序,但C++不能保证。这也是在C++中尽量避免使用全局变量的原因之一。

因为是global/static destructor调用你的destructor,所以你是抓不到那里的异常的。

搜索更多相关主题的帖子: 变量 cout yuanhong 全局 函数 
2007-10-28 13:30
快速回复:to: yuanhong——为什么析构函数的cout不输出呢(释放的为全局变量)( ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.042132 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved