由ZeroMemory()引起的内存泄漏
class CX
{
public:
CX(){ ZeroMemory(this, sizeof(CX)); }
……
}
注意上面的构造函数中ZeroMemory()的使用:这样的构造函数是一种偷懒的写法,如果CX中数据成员都是基本类型的数据这样写完全没有问题。但如果数据成员中有其它自定义类型的数据类型,这时候很容易引起内存泄漏,并且这样的内存泄漏非常不容易察觉。如下面的CB类就会引起内存泄漏:
class CD
{
public:
CD(){m_str = new char[100];}
~CD(){ if(m_str) delete[] m_str;}
char* m_str;
}
class CB
{
public:
CB(){ZeroMemory(this, sizeof(CB));}//引起 CD 类型的数据成员内存泄漏
protected:
vector<CD> m_classCArray;
CD m_classD;
}//备注:构造函数的本质功能并不是构造对象,而是对已经构造好的对象做一些初始化工作。(大多数书中的说法都是错误的!!)
用 _CrtSetBreakAlloc() 检测内存泄漏的具体位置Detected memory leaks!
Dumping objects ->
{522} normal block at 0x0182EB78, 16 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
{521} normal block at 0x0182A328, 8 bytes long.
Data: < 3 > B4 DA 33 00 00 00 00 00
……
{387} normal block at 0x018258C8, 8 bytes long.
Data: < 3 > B4 DA 33 00 00 00 00 00
{386} normal block at 0x01825880, 8 bytes long.
Data: < 3 > 8C DA 33 00 00 00 00 00
Object dump complete.
出现这种情况后在程序的最开始处调用_CrtSetBreakAlloc(386), 这样程序在分配到将要泄漏那块内存时候就会中断,然后再查看调用堆栈看到底是哪个地方申请了这块内存。