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), 这样程序在分配到将要泄漏那块内存时候就会中断,然后再查看调用堆栈看到底是哪个地方申请了这块内存。

posted on 2011-09-12 10:09  yaoyao_cn  阅读(235)  评论(0编辑  收藏  举报