第一行显示该内存块由TestDlg.cpp文件,第70行代码分配,地址在0x00881710,大小为200字节,{59}是指调用内存分配函数的Request Order,关于它的详细信息可以参见MSDN中_CrtSetBreakAlloc()的帮助。第二行显示该内存块前16个字节的内容,尖括号内是以ASCII方式显示,接着的是以16进制方式显示。 一般大家都误以为这些内存泄漏的检测功能是由MFC提供的,其实不然。MFC只是封装和利用了MS C-Runtime Library的Debug Function。非MFC程序也可以利用MS C-Runtime Library的Debug Function加入内存泄漏的检测功能。MS C-Runtime Library在实现malloc/free,strdup等函数时已经内建了内存泄漏的检测功能。 注意观察一下由MFC Application Wizard生成的项目,在每一个cpp文件的头部都有这样一段宏定义: #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif 有了这样的定义,在编译DEBUG版时,出现在这个cpp文件中的所有new都被替换成DEBUG_NEW了。那么DEBUG_NEW是什么呢?DEBUG_NEW也是一个宏,以下摘自afx.h,1632行 #define DEBUG_NEW new(THIS_FILE, __LINE__) 所以如果有这样一行代码: char* p = new char[200]; 经过宏替换就变成了: char* p = new( THIS_FILE, __LINE__)char[200]; 根据C++的标准,对于以上的new的使用方法,编译器会去找这样定义的operator new: void* operator new(size_t, LPCSTR, int) 我们在afxmem.cpp 63行找到了一个这样的operator new 的实现 void* AFX_CDECL operator new(size_t nSize, LPCSTR lpszFileName, int nLine) |
正在阅读:浅谈内存泄漏(二)浅谈内存泄漏(二)
2004-02-14 09:34
出处:PConline
责任编辑:linjixiong
键盘也能翻页,试试“← →”键