Chinaunix首页 | 论坛 | 博客
  • 博客访问: 185853
  • 博文数量: 90
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 0
  • 用 户 组: 普通用户
  • 注册时间: 2017-08-23 16:48
文章分类

全部博文(90)

文章存档

2015年(1)

2011年(21)

2010年(59)

2009年(9)

我的朋友

分类: C/C++

2009-11-22 16:29:45

检查内存泄露使用, 在MFC中都会有这几句话, 在程序推出的时候, 如果有内存没有释放, 会显示在哪个文件的那一行内存泄露

#ifdef _DEBUG //必须是DEBUG版本, RELEASE没有
#define new DEBUG_NEW //用DEBUG_NEW 代替 new
#undef THIS_FILE //解除THIS_FILE定义
static char THIS_FILE[] = __FILE__; //当前文件
#endif


有了这样的定义,在编译DEBUG版时,出现在这个cpp文件中的所有new都被替换成DEBUG_NEW了。那么DEBUG_NEW是什么呢?DEBUG_NEW也是一个宏

#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)

operator new 的实现

void* AFX_CDECL operator new(size_t nSize, LPCSTR lpszFileName, int nLine)



{

return ::operator new(nSize, _NORMAL_BLOCK, lpszFileName, nLine);

}


这里顺便提一下THIS_FILE,__FILE和__LINE__。__FILE__和__LINE__都是编译器定义的宏。当碰到__FILE__ 时,编译器会把__FILE__替换成一个字符串,这个字符串就是当前在编译的文件的路径名。当碰到__LINE__时,编译器会把__LINE__替换 成一个数字,这个数字就是当前这行代码的行号。在DEBUG_NEW的定义中没有直接使用__FILE__,而是用了THIS_FILE,其目的是为了减 小目标文件的大小。假设在某个cpp文件中有100处使用了new,如果直接使用__FILE__,那编译器会产生100个常量字符串,这100个字符串 都是这个cpp文件的路径名,显然十分冗余。如果使用THIS_FILE,编译器只会产生一个常量字符串,那100处new的调用使用的都是指向常量字符 串的指针。

阅读(3301) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~