标题: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



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-181394-1-1.html




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

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