在Linux中,我一直使用valgrind来检查应用程序是否存在内存泄漏。在Windows中有没有类似的工具?能否通过Visual Studio 2010实现这一功能?
在Linux中,我一直使用valgrind来检查应用程序是否存在内存泄漏。在Windows中有没有类似的工具?能否通过Visual Studio 2010实现这一功能?
Visual Studio 2019提供了一个不错的内存分析工具,可以在调试时交互式使用或在编程(无需调试)时使用。下面我将展示两种情况下的最小示例。
主要思路是在进程开始和结束时对堆进行快照,然后比较内存状态以检测潜在的内存泄漏。
创建以下main.cpp
文件(在新控制台应用程序中):
#include <string.h>
int main()
{
int a = 1;
char* s = new char[17];
strcpy_s(s,17,"stackoverflow_pb");
char* ss = new char[14];
strcpy_s(ss, 14,"stackoverflow");
delete[] ss;
return 0;
}
接下来:
Take snapshot
step over
(F10) 几次),并再次拍摄一个快照s
(stackoverflow_pb)存在内存泄漏。您可以通过双击 "char[]" 对象找到它。以上步骤的关键部分显示在以下图像中:
请用以下代码替换原来的代码:
#include <iostream>
#include "windows.h"
#define _CRTDBG_MAP_ALLOC //to get more details
#include <stdlib.h>
#include <crtdbg.h> //for malloc and free
int main()
{
_CrtMemState sOld;
_CrtMemState sNew;
_CrtMemState sDiff;
_CrtMemCheckpoint(&sOld); //take a snapshot
char* s = new char[17];
strcpy_s(s, 17, "stackoverflow_pb");
char* ss = new char[14];
strcpy_s(ss, 14, "stackoverflow");
delete[] ss;
_CrtMemCheckpoint(&sNew); //take a snapshot
if (_CrtMemDifference(&sDiff, &sOld, &sNew)) // if there is a difference
{
OutputDebugString(L"-----------_CrtMemDumpStatistics ---------");
_CrtMemDumpStatistics(&sDiff);
OutputDebugString(L"-----------_CrtMemDumpAllObjectsSince ---------");
_CrtMemDumpAllObjectsSince(&sOld);
OutputDebugString(L"-----------_CrtDumpMemoryLeaks ---------");
_CrtDumpMemoryLeaks();
}
return 0;
}
它通过代码实现相同的功能,因此您可以将其集成到自动构建系统中,函数_CrtMemCheckpoint
获取快照,_CrtMemDifference
比较快照的内存状态,并在它们不同时返回true。
因为这是这种情况,它进入条件块并通过几个函数(请参见_CrtMemDumpStatistics、_CrtMemDumpAllObjectsSince 和 _CrtDumpMemoryLeaks - 后者不需要快照)打印有关泄漏的详细信息。
要查看输出,请在最后一行“return 0”处放置断点,按下F5
并查看调试控制台。以下是输出:
要获取更多信息,请参见以下链接:
new[]
和错误的delete
,2.访问已释放的内存,3.其他破坏内存的方式,如越界访问等。4.访问未初始化的内存。 - Ayxan Haqverdili你觉得使用Visual Leak Detector怎么样?虽然它不是内置的,但我认为它是最受欢迎的。
Dr. Memory 是一款内存监测工具,能够识别与内存相关的编程错误,如访问未初始化的内存、访问不可寻址的内存(包括超出分配堆单元以及堆下溢和上溢),访问已释放的内存、重复释放、内存泄漏以及(在 Windows 上)句柄泄漏、GDI API 使用错误以及访问未保留的线程局部存储插槽。
Dr. Memory 可以运行于 Windows、Linux、Mac 或 Android 上,对经过修改的应用程序二进制文件进行操作,支持通用 IA-32、AMD64 和 ARM 硬件。
Dr. Memory 基于 DynamoRIO 动态检测工具平台构建。
C++内存验证器 可以在使用Visual Studio、Delphi和其他编译器构建的本机Windows程序中查找内存和句柄泄漏。它快速且可以处理大量工作负载(一些用户在一次运行中跟踪数十亿个分配和释放)。
声明:我是C++内存验证器的设计师。我们构建它是因为当我们与SolidWorks R&D Ltd合作时,其他工具无法处理工作负载。
Visual Studio 2015及更高版本拥有本地内存泄漏诊断工具,详情请查看:https://dzone.com/articles/native-memory-leak-diagnostics。
Application Verifier 是一个用于检测本地(C或C++)应用程序中泄漏的好工具。您可以与Visual Studio 或 WinDbg一起使用它。除了内存泄漏外,还可以检查堆损坏、无效句柄使用等问题。与WinDbg (!analyze -v) 一起使用应用程序验证器可以提供良好的见解。
/fsanitize=address /Zi
选项,但您可以参考第一个链接文章中如何将其纳入解决方案和更大项目(通过CMake配置或项目属性调整)。您可以使用DevPartner工具在Visual Studio中查找C ++应用程序中的内存泄漏问题。