如果你想在MFC应用程序中监测内存泄露,你可以使用宏DEBUG_NEW来重定义new运算符,这是new运算符的一个修改版本,可以记录其分配内存的文件名及行数。在Release版中构建的DEBUG_NEW会解析成原始的new运算符。
MFC向导产生的源代码中在#include后米娜包含如下预处理指令:
上面代码就是如何重定义new运算符的方法。
很多STL头文件和这里定义的new运算符不兼容。如果你在重新定义运算符new之后包含了<map><vector><list><string>等头文件,会有如下错误(以<vector>为例):
01
|
1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\xmemory(43) : error C2665: 'operator new': none of the 5 overloads could convert all the argument types
|
02
|
1> c:\program files\microsoft visual studio 9.0\vc\include\new.h(85): could be 'void *operator new(size_t,const std::nothrow_t &) throw()'
|
03
|
1> c:\program files\microsoft visual studio 9.0\vc\include\new.h(93): or 'void *operator new(size_t,void *)'
|
04
|
1> while trying to match the argument list '(const char [70], int)'
|
05
|
1> c:\program files (x86)\microsoft visual studio 9.0\vc\include\xmemory(145) : see reference to function templateinstantiation '_Ty *std::_Allocate<char>(size_t,_Ty *)' being compiled
|
10
|
1> c:\program files (x86)\microsoft visual studio 9.0\vc\include\xmemory(144) : whilecompiling class templatemember function 'char *std::allocator<_Ty>::allocate(std::allocator<_Ty>::size_type)'
|
15
|
1> c:\program files (x86)\microsoft visual studio 9.0\vc\include\xstring(2216) : see reference to classtemplate instantiation 'std::allocator<_Ty>' being compiled
|
解决方法是在包含这些STL文件之后再使用DEBUG_NEW重定义new运算符。