warning C4150: 删除指向不完整“CClient”类型的指针;没有调用析构函数
2013-08-23 23:20
246 查看
今天调试代码发现了一个很怪异的现象,delete 指针竟然没有调用析构函数,具体代码如下
而在函数DeleteClient函数中我调用了delete pClient指令
编译通过,可是运行到DeleteClient函数时产生了错误,delete pClient不执行析构函数,搞得非常郁闷
反汇编代码发行根本没有调用析构函数,不解,于是认为可能在__try/__finally块中delete pClient不会调用析构函数,于是重构代码,删除
__try/__finally块,结果还是没有调用析构函数,继续郁闷,突然发现编译有一个警告,如下
warning C4150: 删除指向不完整“CClient”类型的指针;没有调用析构函数
这才是异常所在,于是将class CClient语句替换为#include "Client.h"语句,警告消失,delete pClient调用析构函数
一定要多看看编译警告啊
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调用析构函数
一定要多看看编译警告啊
相关文章推荐
- warning C4150: 删除指向不完整“XXX”类型的指针;没有调用析构函数
- warning C4150: 删除指向不完整“CBasexxx”类型的指针;没有调用析构函数
- C++析构函数的自动调用(析构函数必须是虚拟的,这样删除父类指针指向的子类对象,才能同时调用两者的析构函数,否则就没有机会调用子类析构函数)
- 解释为什么基类的析构函数不为虚的话,基类指针指向子类对象,删除对象时,派生类的析构函数就不会被调用
- 关于“不允许指针指向不完整的类类型”问题分析
- 析构函数中删除指向this的指针
- 关于通过不含虚析构函数的基类类型的指针删除派生类对象的问题
- 设一个没有头结点指针的单链表。一个指针指向此单链表中间的一个结点(不是第一个,也不是最后一个结点),将该结点从单链表中删除,要求时间复杂度O(1)。
- (转)问题:假设一个没有头指针的单链表。一个指针指向此单链表中间的一个节点(既不是第一个,也不是最后一个节点),请将该节点从单链表中删除。
- 析构函数调用 堆指针 删除时 赋值NULL
- 关于基类指针指向子类对象,构造函数和析构函数调用的顺序的问题。
- 不允许指针指向不完整的类类型
- 智能指针自动识别类型,正确调用析构函数的方法
- “不允许指针指向不完整的类类型”问题
- 关于通过不含虚析构函数的基类类型的指针删除派生类对象的问题
- 有一个单项的链表,在没有头结点的情况下,只知道有一个指向结点B的指针p,假设这个结点B不是尾结点,删除该节点B。
- Error:不允许指针指向不完整的类类型
- (转)问题:假设一个没有头指针的单链表。一个指针指向此单链表中间的一个节点(既不是第一个,也不是最后一个节点),请将该节点从单链表中删除。
- delete 指针之后 ,只是释放了指针指向的内存空间,指针不会自动置为NULL,还有delete 遇到指针为NULL时不会调用析构函数
- 不允许指针指向不完整的类类型