正在阅读:浅谈内存泄漏(二)浅谈内存泄漏(二)

2004-02-14 09:34 出处:PConline 作者:johnnyxia/CSDN 责任编辑:linjixiong

  第一行显示该内存块由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)
键盘也能翻页,试试“← →”键

关注我们

最新资讯离线随时看 聊天吐槽赢奖品