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,所以你是抓不到那里的异常的。