驽马十驾

导航

内存泄露定位

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可以回溯到相应的代码处。 

posted on 2013-04-12 11:49  驽马十驾  阅读(257)  评论(0编辑  收藏  举报