C++内存泄漏检测拾遗

在mfc开发环境中,当运行退出了,visual studio会在输出窗口提示是否有内存泄漏。也可以借助mfc类cmemorystate动态地检测并输出内存泄漏信息。
在非mfc框架中,需要借助crt函数实现这些功能。
1. 调用_crtdumpmemoryleaks()函数会在输出窗口中输出当前的内存泄漏。若在程序开始处加上:_crtsetdbgflag( _crtdbg_alloc_mem_df | _crtdbg_leak_check_df );
语句,crt会在程序的每个出口处自动调用_crtdumpmemoryleaks函数,因此程序终止时会在输出窗口显示所有的内存泄漏。
2.利用_crtmemstate结构定点监测内存泄漏,例:
//定义3个内存状态
_crtmemstate s1,s2,s3;
//记录开始的内存状态
_crtmemcheckpoint( &s1 );
int *p = new int;
//记录结束时的内存状态
_crtmemcheckpoint( &s2 );
//比较2个内存状态,并将差异保存到s3中
if( _crtmemdifference( &s3, &s1, &s2 ) )
{
//输出内存泄漏信息
_crtmemdumpallobjectssince( &s3 );
}
3. 重定向输出信息。内存泄漏提示默认是输出在输出窗口中,可以通过_crtsetreportmode重定向其输出位置。例(重定向输出到指定文件):
catlfile hfile;
hfile.create( _t(d:\\report.txt), generic_write, file_share_write, create_always );
_crtsetreportmode( _crt_warn, _crtdbg_mode_file );
_crtsetreportfile( _crt_warn, hfile );
此外还可以重定向为窗体提示(带有终止、继续、忽略按钮的窗体),断言就是输出为此窗体。还可以通过_crtsetreporthook函数在输出到指定目的地之前拦截消息。如:
_crtsetreporthook( myreportingfunction );
myreportingfunction 的定义如下:
int myreportingfunction( int nreporttype, char *szmsg, int *pretval )
{
*pretval = 0;
if( nreporttype == _crt_warn )
{
atlmessagebox( null, _u_stringorid( ca2t(szmsg)));
}
return 0;
}

2017年企业比特币使用情况及相关数据报告
华为达成与小米专利许可协议,科普:通信专利许可为啥这么难谈?
2011中国(肇庆)嵌入式技术创新应用大会
aigo国民好物固态硬盘P3000建功,让电脑全方位提速
高温线是一种什么线,高温线的种类有哪些
C++内存泄漏检测拾遗
三部委发布一系列鼓励消费政策 无线充电成重点
你必须要了解模拟系统中动态范围的解决方法
VR环保教育 | 全民垃圾分类虚拟仿真互动体验,游戏化场景轻松学会垃圾分类
降低电路漏电功耗的低功耗设计方法
苹果iPhone16 Pro新机将采用1MG+7P模造玻璃塑模组及48MP传感器
IGBT管的结构 IGBT管的注意事项
本源量子和中科大团队合作在非绝热几何量子计算领域取得重要进展
雷军香港见李嘉诚 长和将在全球17700家门店销售小米设备
AMD Zen的下一站将Zen 4预计将在2022年上半年推出
高杂波衰减系统关键性能指标介绍
科氏力质量流量计在反应釜投料控制中的应用案例
苹果AppleCare+for Mac正式面向中国市场推出
盘点2013:智能电网行业“大事件”TOP10
常见错误危及工业数据安全