请问一个关于C++类的全局对象析构的有关问题,认真回答了就给分
请教一个关于C++类的全局对象析构的问题,认真回答了就给分
#include <iostream>
using namespace std;
class CObject
{
public:
CObject(){cout < < "CObject Constructor! " < <endl;}
~CObject(){cout < < "CObject Destructor! " < <endl;}
};
class CCmdTarget:public CObject
{
public:
CCmdTarget(){cout < < "CCmdTarget Constructor! " < <endl;}
~CCmdTarget(){cout < < "CCmdTarget Destructor! " < <endl;}
};
class CWinThread:public CCmdTarget
{
public:
CWinThread(){cout < < "CWinThread Constructor! " < <endl;}
~CWinThread(){cout < < "CWinThread Destructor! " < <endl;}
};
class CWinApp:public CWinThread
{
public:
CWinApp(){cout < < "CWinApp Constructor! " < <endl;}
~CWinApp(){cout < < "CWinApp Destructor! " < <endl;}
};
class CWnd:public CWinThread
{
public:
CWnd(){cout < < "CWnd Constructor! " < <endl;}
~CWnd(){cout < < "CWnd Destructor! " < <endl;}
};
class CFrameWnd:public CWnd
{
public:
CFrameWnd(){cout < < "CFrameWnd Constructor! " < <endl;}
~CFrameWnd(){cout < < "CFrameWnd Destructor! " < <endl;}
};
////////////////////////////////////////////////
class CMyFrameWnd:public CFrameWnd
{
public:
CMyFrameWnd(){cout < < "CMyFrameWnd Constructor! " < <endl;}
~CMyFrameWnd(){cout < < "CMyFrameWnd Destructor! " < <endl;}
};
class CMyWinApp:public CWinApp
{
public:
CMyWinApp(){cout < < "CMyWinApp Constructor! " < <endl;}
~CMyWinApp(){cout < < "CMyWinApp Destructor! " < <endl;}
};
CMyWinApp theApp; //这里定义一个全局变量
void main()
{
cout < < "Running in main " < <endl;
return;
}
这个成立在main函数前定义了一个CMyWinApp的全局变量,程序运行后为什么CMyWinApp以及它的父类的析构函数都不执行呢?他们的构造函数都是执行了的啊。。。为什么?请知道的讲解一下,请详细一点。
------解决方案--------------------
这是VC的类析构顺序的不同导致的。其实cout本身就是一个类。我的意思是说:全局对象在调用 main之前初始化, 在退出main之后析构。这话没错。问题是cout对象在theApp之前析构。如果你把 CMyWinApp(){cout < < "CMyWinApp Constructor! " < <endl;}
~CMyWinApp(){cout < < "CMyWinApp Destructor! " < <endl;}
换为
CMyWinApp(){printf( "CMyWinApp Constructor!\n ");}
~CMyWinApp(){printf( "CMyWinApp Destructor!\n ");}
相信你会看到~CMyWinApp()函数执行。当然前面要加上#include <stdio.h>
#include <iostream>
using namespace std;
class CObject
{
public:
CObject(){cout < < "CObject Constructor! " < <endl;}
~CObject(){cout < < "CObject Destructor! " < <endl;}
};
class CCmdTarget:public CObject
{
public:
CCmdTarget(){cout < < "CCmdTarget Constructor! " < <endl;}
~CCmdTarget(){cout < < "CCmdTarget Destructor! " < <endl;}
};
class CWinThread:public CCmdTarget
{
public:
CWinThread(){cout < < "CWinThread Constructor! " < <endl;}
~CWinThread(){cout < < "CWinThread Destructor! " < <endl;}
};
class CWinApp:public CWinThread
{
public:
CWinApp(){cout < < "CWinApp Constructor! " < <endl;}
~CWinApp(){cout < < "CWinApp Destructor! " < <endl;}
};
class CWnd:public CWinThread
{
public:
CWnd(){cout < < "CWnd Constructor! " < <endl;}
~CWnd(){cout < < "CWnd Destructor! " < <endl;}
};
class CFrameWnd:public CWnd
{
public:
CFrameWnd(){cout < < "CFrameWnd Constructor! " < <endl;}
~CFrameWnd(){cout < < "CFrameWnd Destructor! " < <endl;}
};
////////////////////////////////////////////////
class CMyFrameWnd:public CFrameWnd
{
public:
CMyFrameWnd(){cout < < "CMyFrameWnd Constructor! " < <endl;}
~CMyFrameWnd(){cout < < "CMyFrameWnd Destructor! " < <endl;}
};
class CMyWinApp:public CWinApp
{
public:
CMyWinApp(){cout < < "CMyWinApp Constructor! " < <endl;}
~CMyWinApp(){cout < < "CMyWinApp Destructor! " < <endl;}
};
CMyWinApp theApp; //这里定义一个全局变量
void main()
{
cout < < "Running in main " < <endl;
return;
}
这个成立在main函数前定义了一个CMyWinApp的全局变量,程序运行后为什么CMyWinApp以及它的父类的析构函数都不执行呢?他们的构造函数都是执行了的啊。。。为什么?请知道的讲解一下,请详细一点。
------解决方案--------------------
这是VC的类析构顺序的不同导致的。其实cout本身就是一个类。我的意思是说:全局对象在调用 main之前初始化, 在退出main之后析构。这话没错。问题是cout对象在theApp之前析构。如果你把 CMyWinApp(){cout < < "CMyWinApp Constructor! " < <endl;}
~CMyWinApp(){cout < < "CMyWinApp Destructor! " < <endl;}
换为
CMyWinApp(){printf( "CMyWinApp Constructor!\n ");}
~CMyWinApp(){printf( "CMyWinApp Destructor!\n ");}
相信你会看到~CMyWinApp()函数执行。当然前面要加上#include <stdio.h>