今天调试代码发现了一个很怪异的现象,delete 指针竟然没有调用析构函数,具体代码如下
class CClient;
class CClientManager
{
private:
CClientManager(void);
~CClientManager(void);
public:
static CClientManager& GetInstance();
public:
void InsertClient(CClient* pClient);
void DeleteClient(CClient* pClient);
BOOL Initialize();
BOOL Uninitialize();
private:
CRITICAL_SECTION m_cs;
list<CClient*> m_vClients;
而在函数DeleteClient函数中我调用了delete pClient指令
编译通过,可是运行到DeleteClient函数时产生了错误,delete pClient不执行析构函数,搞得非常郁闷
反汇编代码发行根本没有调用析构函数,不解,于是认为可能在__try/__finally块中delete pClient不会调用析构函数,于是重构代码,删除
__try/__finally块,结果还是没有调用析构函数,继续郁闷,突然发现编译有一个警告,如下
warning C4150: 删除指向不完整“CClient”类型的指针;没有调用析构函数
这才是异常所在,于是将class CClient语句替换为#include "Client.h"语句,警告消失,delete pClient调用析构函数
一定要多看看编译警告啊