下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、MFC下检查和消除内存泄露的技巧摘要本文分析了Windows环境使用MFC调试内存泄露的技术,介绍了在Windows环境下用VC+查找,定位和消除内存泄露的方法技巧。关键词:VC+;CRT 调试堆函数;试探法。编译环境VC+6.0技术原理检测内存泄漏的主要工具是调试器和 CRT 调试堆函数。若要启用调试堆函数,请在程序中包括以下语句: #define CRTDBG_MAP_ALLOC#include #include 注意 #include 语句必须采用上文所示顺序。如果更改了顺序,所使用的函数可能无法正确工作。 通过包括 crtdbg.h,将 malloc 和 free 函数映射到其“Deb
2、ug”版本_malloc_dbg 和_free_dbg,这些函数将跟踪内存分配和释放。此映射只在调试版本(在其中定义了 _DEBUG)中发生。发布版本使用普通的 malloc 和 free 函数。#define 语句将 CRT 堆函数的基版本映射到对应的“Debug”版本。并非绝对需要该语句,但如果没有该语句,内存泄漏转储包含的有用信息将较少。在添加了上面所示语句之后,可以通过在程序中包括以下语句来转储内存泄漏信息:_CrtDumpMemoryLeaks(;当在调试器下运行程序时,_CrtDumpMemoryLeaks 将在“输出”窗口中显示内存泄漏信息。内存泄漏信息如下所示:Detected
3、 memory leaks!Dumping objects ->C:PROGRAM FILESVISUAL STUDIOMyProjectsleaktestleaktest.cpp(20 : 18 normal block at 0x00780E80, 64 bytes long.Data: <> CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CDObject dump complete. 如果不使用 #define _CRTDBG_MAP_ALLOC 语句,内存泄漏转储如下所示: Detected memory leaks! Du
4、mping objects -> 18 normal block at 0x00780E80, 64 bytes long. Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD Object dump complete. 未定义 _CRTDBG_MAP_ALLOC 时,所显示的会是: 内存分配编号(在大括号内)。 块类型(普通、客户端或 CRT)。 十六进制形式的内存位置。 以字节为单位的块大小。 前 16 字节的内容(亦为十六进制)。 定义了 _CRTDBG_MAP_ALLOC 时,还会显示在其中分配泄漏的内存
5、的文件。文件名后括号中的数字(本示例中为 20)是该文件内的行号。 转到源文件中分配内存的行 在"输出"窗口中双击包含文件名和行号的行。 -或- 在"输出"窗口中选择包含文件名和行号的行,然后按 F4 键。_CrtSetDbgFlag 如果程序总在同一位置退出,则调用 _CrtDumpMemoryLeaks 足够方便,但如果程序可以从多个位置退出该怎么办呢?不要在每个可能的出口放置一个对 _CrtDumpMemoryLeaks 的调用,可以在程序开始包括以下调用: _CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTD
6、BG_LEAK_CHECK_DF ; 该语句在程序退出时自动调用 _CrtDumpMemoryLeaks。必须同时设置 _CRTDBG_ALLOC_MEM_DF 和 _CRTDBG_LEAK_CHECK_DF 两个位域,如上所示。 说明 在VC+6.0的环境下,不再需要额外的添加 #define CRTDBG_MAP_ALLOC #include #include 只需要按F5,在调试状态下运行,程序退出后在"输出窗口"可以看到有无内存泄露。如果出现 Detected memory leaks! Dumping objects -> 就有内存泄露。 确定内存泄露的地方
7、 根据内存泄露的报告,有两种消除的方法: 第一种比较简单,就是已经把内存泄露映射到源文件的,可以直接在"输出"窗口中双击包含文件名和行号的行。例如 Detected memory leaks! Dumping objects -> C:PROGRAM FILESVISUAL STUDIOMyProjectsleaktestleaktest.cpp(20 : 18 normal block at 0x00780E80, 64 bytes long. Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
8、CD Object dump complete.C:PROGRAM FILESVISUAL STUDIOMyProjectsleaktestleaktest.cpp(20就是源文件名称和行号。 第二种比较麻烦,就是不能映射到源文件的,只有内存分配块号。 Detected memory leaks! Dumping objects -> 18 normal block at 0x00780E80, 64 bytes long. Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD Object dump comple
9、te. 这种情况我采用一种"试探法"。由于内存分配的块号不是固定不变的,而是每次运行都是变化的,所以跟踪起来很麻烦。但是我发现虽然内存分配的块号是变化的,但是变化的块号却总是那几个,也就是说多运行几次,内存分配的块号很可能会重复。因此这就是"试探法"的基础。 1. 先在调试状态下运行几次程序,观察内存分配的块号是哪几个值; 2. 选择出现次数最多的块号来设断点,在代码中设置内存分配断点: 添加如下一行(对于第 18 个内存分配): _crtBreakAlloc = 18; 或者,可以使用具有同样效果的 _CrtSetBreakAlloc 函数: _CrtSetBreakAlloc(18; 3. 在调试状态下运行序,在断点停下时
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 逾期未提交项目报告催办函8篇
- 物联网系统集成与调试实战指南
- 环保行业废水处理技术手册
- 团队冲突解决与管理策略
- 提升社区服务标准的承诺函4篇
- 工程质量控制责任承诺书范文5篇
- 企业客户服务与满意度提升指导书
- 营销活动策划书撰写指南市场推广策略及执行模板
- 今后交付准时保证函4篇
- 宠物意外伤害与紧急处理预案
- 【耳鼻喉9版】喉科学第八章 喉的神经性疾病
- 接地线课件教学课件
- 2025年陪诊师考试经典试题及答案发布
- 黄金三点式讲话课件
- 2025 年高职数字媒体技术(数字媒体)试题及答案
- 国家开放大学2025年秋《家庭社会学》终考作业答案
- 2025年江西会考英语试卷及答案
- 2025中国华电集团有限公司校园招聘笔试历年参考题库附带答案详解
- 2025年希望杯IHC-三年级真题(含答案)
- 贵州银行笔试题库及答案
- 胶带输送机司机考试题含答案
评论
0/150
提交评论