博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
VC++ 内存泄露与检测的一种方法
阅读量:6910 次
发布时间:2019-06-27

本文共 1141 字,大约阅读时间需要 3 分钟。

    本文介绍,当VC++或者MFC程序,出现内存泄露时,如何快速定位的方法,这种方法有一定的局限性,在注意事项中会给出的。

MFC程序

    当MFC程序出现内存泄露时,退出程序时的VS调试输出窗口,一般会有如下显示:

   上面显示了在程序的哪个文件的哪行语句,发生了内存泄露,其中:

   {345}: 表示 内存分配编号

   normal block:表示 内存块类型,有普通块(普通程序分配)、客户端块(分配基于CObject的内存)和CRT块(库函数内部分配)这几种类型

   0x0074A030:以16进制形式输出的内存位置

   40 bytes long: 以字节为单位的内存块大小

   Data<   >CD CD ..:内存块前16个字节的内容,16进制表示。

      定位内存泄露位置,可以双击泄露信息,也可以在输出窗口 按F4键,跳转到 出错行。

 

普通VC++程序

    在普通VC++程序中,要类似MFC中内存检测的效果,需要做如下操作。

    1.  在头文件中,添加  #include <ctrdbg.h>

    2.  在程序入口最开始处,添加 下面两句话即可

        _CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );    //设置调试堆函数跟踪分配的方式

        //_CrtSetBreakAlloc();     //这句话,在确实有内存泄露的情况下,给 内存分配编号

    3. 按F5,运行程序,等待程序退出后,在输出窗口可以看到下面的情况:

     

     如图所示,程序有两处内存泄露地方,分配编号为 476 和 475,此时,给_CrtSetBreakAlloc()函数传入476参数,再次运行程序,在退出时,会弹出如下窗口:

    

点击 中断  跳到,_CrtSetBreakAlloc()中断的地方,然后在程序中,通过查看调用堆栈,就可以看到应用程序的哪一次new操作没有执行delete操作。

在中断的同时,也可以从控制台中,看到整个程序析构的顺序,如下图所示:

 

注意事项

1. 当程序确认没有内存泄露时,不可以调用_CrtSetBreakAlloc(475),因为,这样会在指定内存分配次数发生时,强制中断程序。

2. 这种检测内存分配的方式,要求,程序在执行过程中,是可还原的(多次执行过程的内存分配顺序不会发送变化),这个假设,在多数情况下是成立的,不过,在多线程执行的环境下,有时候难以保证。

3. 对于普通C程序,上述检测方法也是成立的,只不过new换成了malloc,delete换成了free

4. 比如 int *p = new int[4]; delete p; 这种方式的泄露,上述方法是检测不出来,此时,需要cppcheck等更有力的工具来检查。

 

参考链接:

转载地址:http://yvgdl.baihongyu.com/

你可能感兴趣的文章
张伯旭:北京亦庄着力打造中国云产业园
查看>>
Android中的利器-AsyncTask
查看>>
后高考时代必备APP 社交、旅行都不能少
查看>>
极简网络:不止于4.0,只为“更简单”
查看>>
大数据优化 | 预见未来:谁是你的“克里斯”
查看>>
人工智能医生可以更准确地预测心脏疾病患者的死亡时间
查看>>
静态之殇 GIN实时防护体系打造安全生态系统
查看>>
九九数据海外CDN助力直播开拓全球业务
查看>>
CTO下午茶:找到海神的三叉戟,打破运维的魔与咒
查看>>
企业移动化安全要先行
查看>>
行业观察:这是一个“认知优先”世界
查看>>
新华网与阿里合资创立云计算公司
查看>>
全闪数据中心的数据缩减攻略
查看>>
如何有效减少测试用例数目
查看>>
警惕!2016最大难题或源于云计算并发症
查看>>
亚信安全预警:一大波勒索软件变种来袭
查看>>
手机网民达7.8亿 移动网络安全不容忽视
查看>>
《算法基础》——3.4 有序链表
查看>>
《UNIX网络编程 卷2:进程间通信(第2版)》——2.3 创建与打开IPC通道
查看>>
商务直播跨海云:商务直播的那点事
查看>>