博客
关于我
【内存】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/

    你可能感兴趣的文章
    mysqlbinlog报错unknown variable ‘default-character-set=utf8mb4‘
    查看>>
    mysqldump 参数--lock-tables浅析
    查看>>
    mysqldump 导出中文乱码
    查看>>
    mysqldump 导出数据库中每张表的前n条
    查看>>
    mysqldump: Got error: 1044: Access denied for user ‘xx’@’xx’ to database ‘xx’ when using LOCK TABLES
    查看>>
    Mysqldump参数大全(参数来源于mysql5.5.19源码)
    查看>>
    mysqldump备份时忽略某些表
    查看>>
    mysqldump实现数据备份及灾难恢复
    查看>>
    mysqldump数据库备份无法进行操作只能查询 --single-transaction
    查看>>
    mysqldump的一些用法
    查看>>
    mysqli
    查看>>
    MySQLIntegrityConstraintViolationException异常处理
    查看>>
    mysqlreport分析工具详解
    查看>>
    MySQLSyntaxErrorException: Unknown error 1146和SQLSyntaxErrorException: Unknown error 1146
    查看>>
    Mysql_Postgresql中_geometry数据操作_st_astext_GeomFromEWKT函数_在java中转换geometry的16进制数据---PostgreSQL工作笔记007
    查看>>
    mysql_real_connect 参数注意
    查看>>
    mysql_secure_installation初始化数据库报Access denied
    查看>>
    MySQL_西安11月销售昨日未上架的产品_20161212
    查看>>
    Mysql——深入浅出InnoDB底层原理
    查看>>
    MySQL“被动”性能优化汇总
    查看>>