博客
关于我
【内存】VS检测内存泄漏,定位泄漏代码位置方法
阅读量:507 次
发布时间:2019-03-06

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

C/C++中的内存泄漏及查找方法(一)

在编写C/C++程序时,内存泄漏问题是一个常见但难以察觉的问题。内存泄漏可能会导致程序占用大量内存,表现为性能下降、故障或应用崩溃等问题。因此,如何有效检测和定位内存泄漏对程序开发和维护至关重要。本文将介绍两种常用的内存泄漏检测方法,并提供详细的使用步骤。


方法一:使用CRT的CrtDumpMemoryLeaks函数

微软提供的C Run-Time (CRT)库内置了检测内存泄漏的功能,通过简单的配置可以快速查找内存泄漏点。

1. 包含相应头文件

确保在程序中包含以下头文件:

#include 

这将使CRT的调试功能变为有效状态。

2. 在程序退出时调用 _CrtDumpMemoryLeaks 函数

在程序的各个退出点(如 main 函数的末尾)添加以下代码:

_CrtDumpMemoryLeaks();

3. 使用 _CrtSetDbgFlag 查找内存泄漏位置

为了在多个退出点自动检测内存泄漏,可以使用 _CrtSetDbgFlag 函数。建议在程序初始化时添加如下代码:

_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);

4. 通过CRT检测结果

程序退出后,在输出窗口中可以看到内存泄漏的详细信息。例如,以下是检测输出的示例:

Detected memory leaks!Dumping objects - 453: normal block at 0x02432CA8, 868 bytes long....Object dump complete.

疑问:为什么会出现类似的内存泄漏报告?

在上述示例中,{453} 表示泄漏的内存块ID,而 normal block 表示这些内存使用的是标准的内存分配方式中的“块”类型。864 bytes long 表示内存泄漏的大小。通过这些信息,可以定位到具体是哪里未释放内存。

5. 定位内存泄漏代码位置

为了追查具体的内存泄漏代码,CRT提供了一个调试功能 _CrtSetBreakAlloc。在检测到内存泄漏时,添加如下代码在所释放的内存位置插入断点:

_CrtSetBreakAlloc(453);

运行程序时,调试工具会在断点处停止,允许开发者定位具体的泄漏位置。这通常涉及查看调用栈,找出内存泄漏的具体函数 и代码行。


方法二:使用Visual Leak Detector(VLD)插件

Visual Leak Detector(VLD)是一款功能强大的内存泄漏检测工具,可通过Visual Studio 追踪和定位内存泄漏。

1. 安装VLD插件

通过以下链接下载并安装VLD插件:

https://vld.codeplex.com/

2. 启用VLD功能

在项目中添加以下头文件,确保所有相关代码都能使用VLD功能:

#include 

3. 在调试环境中运行程序

确保使用调试版本的程序进行运行,VLD只能在调试模式下有效检测内存泄漏。

4. 查看内存泄漏报告

运行程序后,在输出窗口可以看到内存泄漏的详细报告。例如,以下示例显示了多块内存的泄漏情况:

Detected memory leaks:1. [453] normal block at 0x02432CA8, 868 bytes long....2. [204] normal block at 0x01E1BF30, 44 bytes long....Object dump complete.

5. 截取内存快照定位泄漏

在VLD工具中,可以使用内存快照功能来定位泄漏。具体步骤如下:

  • 在泄漏发生的函数处打断点。
  • 使用 Memory Usage 标签页查看当前的内存分配。
  • 点击 Take Snapshot 按钮记录内存状态。
  • 重复上述操作,记录两次快照以比较内存变化。
  • 通过比较快照结果,定位到泄漏的具体内存区域。
  • 点击泄漏的内存块,VLD会自动定位到相应的代码,比如函数和变量声明处,帮助开发者快速定位问题。

    6. 强大的分析工具

    VLD还提供了一些强大的分析工具,帮助开发者理解内存分配和泄漏情况。例如,可以追踪分配给 char*CString 的内存块,从而精确定位泄漏源头。


    注意事项

    • **逐步 Zemepro **:内存泄漏不必全部归因于开发者的疏忽。系统内存泄漏通常是由于指针未正确释放、数组未正确删除或对静态变量的不当使用等原因。通过合理的内存管理和使用上述工具,可以有效减少内存泄漏问题。

    通过以上方法,开发者可以轻松检测和定位C/C++程序中的内存泄漏问题。在实际开发中,可以根据项目需求选择最适合的工具。如果需要更深入的分析,Visual Leak Detector提供了强大的功能,非常适合日常开发。

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

    你可能感兴趣的文章
    MySQL不同字符集及排序规则详解:业务场景下的最佳选
    查看>>
    Mysql不同官方版本对比
    查看>>
    MySQL与Informix数据库中的同义表创建:深入解析与比较
    查看>>
    mysql与mem_细说 MySQL 之 MEM_ROOT
    查看>>
    MySQL与Oracle的数据迁移注意事项,另附转换工具链接
    查看>>
    mysql丢失更新问题
    查看>>
    MySQL两千万数据优化&迁移
    查看>>
    MySql中 delimiter 详解
    查看>>
    MYSQL中 find_in_set() 函数用法详解
    查看>>
    MySQL中auto_increment有什么作用?(IT枫斗者)
    查看>>
    MySQL中B+Tree索引原理
    查看>>
    mysql中cast() 和convert()的用法讲解
    查看>>
    mysql中datetime与timestamp类型有什么区别
    查看>>
    MySQL中DQL语言的执行顺序
    查看>>
    mysql中floor函数的作用是什么?
    查看>>
    MySQL中group by 与 order by 一起使用排序问题
    查看>>
    mysql中having的用法
    查看>>
    MySQL中interactive_timeout和wait_timeout的区别
    查看>>
    mysql中int、bigint、smallint 和 tinyint的区别、char和varchar的区别详细介绍
    查看>>
    mysql中json_extract的使用方法
    查看>>