内存泄露定位
vs 2008提示内存泄露的代码大概如下面所示:
Dumping objects ->
X:\...\xxx.cpp(46) : {1532} normal block at 0x019BCC60, 1 bytes long.
Data: < > 0A
Object dump complete.
xxx.cpp指出内存泄露的代码所在的文件,(46)代表行号,{1532}申请内存时获得的顺序号(allocation order number),
0x019BCC60代表内存地址,1 bytes long说明泄露的内存大小为1bytes
Data: < > 0A是泄露的内存处的数据。
如果有文件和行号,我们可以很快定位到泄露的代码处,但是有些时候泄露信息并不包括文件和行号。
这时就要用到allocation order number来定位泄露。
我们可以在app文件的Instance()开始位置加入
int tmpFlag = _CrtSetDbgFlag( _CRTDBG_REPORT_FLAG ); tmpFlag |= _CRTDBG_LEAK_CHECK_DF; _CrtSetDbgFlag( tmpFlag ); _CrtSetBreakAlloc(1532);
这样当我们再次运行程序时,程序就会在申请1532这个内存时中断,此时再根据call stack可以回溯到相应的代码处。