VC++/Qt Creator内存泄漏检测方法(1):_CrtSetDbgFlag与_CrtDumpMemoryLeaks

简介: VC++/Qt Creator内存泄漏检测方法(1):_CrtSetDbgFlag与_CrtDumpMemoryLeaks

微软官网说明


finding-memory-leaks-using-the-crt-library


https://docs.microsoft.com/en-us/visualstudio/debugger/finding-memory-leaks-using-the-crt-library?view=vs-2019


VS使用MFC开发项目的话,有自带的简单内存泄漏提示。例如:


Detected memory leaks!
Dumping objects ->
{1474} normal block at 0x0000000000335DF0, 16 bytes long.
 Data: <  4             > 10 80 34 00 00 00 00 00 00 00 00 00 00 00 00 00 
{1473} normal block at 0x0000000000348010, 960 bytes long.
 Data: <                > 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
{1472} normal block at 0x0000000000335DA0, 16 bytes long.
 Data: <`               > 60 D4 87 03 00 00 00 00 00 00 00 00 00 00 00 00 
{1471} normal block at 0x000000000387D460, 3200 bytes long.
 Data: <                > 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
{1470} normal block at 0x0000000003879040, 712 bytes long.
 Data: <  ,@      ,@    > 80 94 2C 40 01 00 00 00 D8 94 2C 40 01 00 00 00 
Object dump complete.


使用crtdbg方法检测内存泄漏


那Win32或者Qt Creator的程序呢?Visual Studio调试器和C运行时库(CRT)可以帮助您检测和识别内存泄漏。需要自行添加代码检测。解决方法如下:


0、cpp源文件需要添加以下内容

#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>


1、在main()程序开始的地方,加上代码:


_CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF ); //A


_CrtSetBreakAlloc(1472); //1472为上面内存泄漏的块号。


_CrtSetBreakAlloc(1471);


_CrtSetBreakAlloc(1470);


或者在结束的地方,加上:


_CrtDumpMemoryLeaks(); //B


A和B语句二选一。如果应用程序只有1个出口,请在应用程序退出点之前调用_CrtDumpMemoryLeaks,退出时会显示内存泄漏报告。如果您的应用有多个出口,则无需_CrtDumpMemoryLeaks在每个出口处手动放置,请在应用程序的开头放_CrtSetDbgFlag。


2、用Debug模式运行,程序自动断点在“内存块1472”分配的位置。


/* break into debugger at specific memory allocation */
if (_crtBreakAlloc != -1L && lRequest == _crtBreakAlloc)
_CrtDbgBreak();

3、我们已经找到了泄漏的那块内存分配的底层操作的地方了。这个时候一直利用“调试”-“退出”,或快捷键“SHIFT+F11”跳转,直到看到了自己的代码。


4、检查自己在该代码中分配的内存块,是否进行了合理的释放。


5、问题解决之后,记得把_CrtSetBreakAlloc(xxx); 这句话删除掉,否则每次debug都断点,耽误事儿。


6、注意到了 _CrtSetDbgFlag(...) 这个函数没?它的说明如下:


Retrieves or modifies the state of the _crtDbgFlag flag to control the allocation behavior of the debug heap manager (debug version only).


_CRTDBG_LEAK_CHECK_DF 说明如下:


Perform automatic leak checking at program exit through a call to _CrtDumpMemoryLeaks and generate an error report if the application failed to free all the memory it allocated.


Qt Creator应用案例


LiteIDE是使用Qt写的应用程序,里面大量应用了crtdbg内存泄露检测的方法


https://github.com/visualfc/liteide


main.cpp入口处有:

#if defined(_MSC_VER) && defined(_DEBUG)

   _CrtSetDbgFlag(_CrtSetDbgFlag(_CRTDBG_REPORT_FLAG) | _CRTDBG_LEAK_CHECK_DF);

#endif

每个cpp文件都有以下宏定义:

//lite_memory_check_begin
#if defined(WIN32) && defined(_MSC_VER) &&  defined(_DEBUG)
     #define _CRTDBG_MAP_ALLOC
     #include <stdlib.h>
     #include <crtdbg.h>
     #define DEBUG_NEW new( _NORMAL_BLOCK, __FILE__, __LINE__ )
     #define new DEBUG_NEW
#endif
//lite_memory_check_end

个人建议把宏定义放在预编译头文件,这样每个cpp文件都可以检测内存泄露。



姊妹篇


另外,内存泄漏检测除了本篇提到的方法之外,还可以使用Visual Leak Detector或者Windbg。详情见:

VC++内存泄漏检测方法(2):Checkpoint/DumpStatistics

VC++内存泄漏检测方法(3):Visual Leak Detector(VLD内存泄漏检测工具)

VC++内存泄漏检测方法(4):【第1篇的补充说明】详解基于Crt的内存泄漏检测

VC++内存泄漏检测方法(5):使用强大的Windbg工具

相关文章
|
API C++ Windows
Visual C++运行库、.NET Framework和DirectX运行库的作用及常见问题解决方案,涵盖MSVCP140.dll丢失、0xc000007b错误等典型故障的修复方法
本文介绍Visual C++运行库、.NET Framework和DirectX运行库的作用及常见问题解决方案,涵盖MSVCP140.dll丢失、0xc000007b错误等典型故障的修复方法,提供官方下载链接与系统修复工具使用指南。
2336 2
|
12月前
|
弹性计算 定位技术 数据中心
阿里云服务器配置选择方法:付费类型、地域及CPU内存配置全解析
阿里云服务器怎么选?2025最新指南:就近选择地域,降低延迟;长期使用选包年包月,短期灵活选按量付费;企业选2核4G5M仅199元/年,个人选2核2G3M低至99元/年,高性价比爆款推荐,轻松上云。
1295 11
|
存储 安全 iOS开发
内存卡怎么格式化?6个格式化方法供你选
随着使用时间的增加,内存卡可能会因为数据积累、兼容性或是文件系统损坏等原因需要进行格式化。那么怎样正确格式化内存卡呢?格式化内存卡的时候需要注意什么呢?本文会给大家提供详细的步骤,帮助大家轻松完成格式化内存卡的操作。
|
存储 缓存 监控
用 C++ 红黑树给公司电脑监控软件的日志快速排序的方法
本文介绍基于C++红黑树算法实现公司监控电脑软件的日志高效管理,利用其自平衡特性提升日志排序、检索与动态更新效率,并结合实际场景提出优化方向,增强系统性能与稳定性。
304 4
|
监控 JavaScript Java
Node.js中内存泄漏的检测方法
检测内存泄漏需要综合运用多种方法,并结合实际的应用场景和代码特点进行分析。及时发现和解决内存泄漏问题,可以提高应用的稳定性和性能,避免潜在的风险和故障。同时,不断学习和掌握内存管理的知识,也是有效预防内存泄漏的重要途径。
1188 159
|
存储 监控 算法
基于跳表数据结构的企业局域网监控异常连接实时检测 C++ 算法研究
跳表(Skip List)是一种基于概率的数据结构,适用于企业局域网监控中海量连接记录的高效处理。其通过多层索引机制实现快速查找、插入和删除操作,时间复杂度为 $O(\log n)$,优于链表和平衡树。跳表在异常连接识别、黑名单管理和历史记录溯源等场景中表现出色,具备实现简单、支持范围查询等优势,是企业网络监控中动态数据管理的理想选择。
368 0
|
SQL 数据库连接 数据库
在C++的QT框架中实现SQLite数据库的连接与操作
以上就是在C++的QT框架中实现SQLite数据库的连接与操作的基本步骤。这些步骤包括创建数据库连接、执行SQL命令、处理查询结果和关闭数据库连接。在实际使用中,你可能需要根据具体的需求来修改这些代码。
1008 14
|
存储 Windows
内存卡坏了还能修吗?4种常见修复方法
内存卡出现“无法保存”或“存储异常”等问题时,不一定是硬件损坏,可能是系统错误或文件系统异常导致。本文介绍几种亲测有效的修复方法:1) 更换读卡设备排除接触问题;2) 格式化修复文件系统(需先备份数据);3) 使用DiskGenius检测坏道;4) 借助厂商工具深度修复。同时提供日常保养建议,如避免高温环境、养成数据备份习惯,延长内存卡使用寿命。通过这些方法,多数问题可轻松解决,无需更换硬件。
|
传感器 人工智能 物联网
C 语言在计算机科学中尤其在硬件交互方面占据重要地位。本文探讨了 C 语言与硬件交互的主要方法,包括直接访问硬件寄存器、中断处理、I/O 端口操作、内存映射 I/O 和设备驱动程序开发
C 语言在计算机科学中尤其在硬件交互方面占据重要地位。本文探讨了 C 语言与硬件交互的主要方法,包括直接访问硬件寄存器、中断处理、I/O 端口操作、内存映射 I/O 和设备驱动程序开发,以及面临的挑战和未来趋势,旨在帮助读者深入了解并掌握这些关键技术。
612 6
WK
|
开发框架 开发工具 C++
C++跨平台框架Qt
Qt是一个功能强大的C++跨平台应用程序开发框架,支持Windows、macOS、Linux、Android和iOS等操作系统。它提供了250多个C++类,涵盖GUI设计、数据库操作、网络编程等功能。Qt的核心特点是跨平台性、丰富的类库、信号与槽机制,以及良好的文档和社区支持。Qt Creator是其官方IDE,提供了一整套开发工具,方便创建、编译、调试和运行应用程序。Qt适用于桌面、嵌入式和移动应用开发。
WK
1051 5

推荐镜像

更多
  • qt