使用Visual Studio在C++应用程序中查找内存泄漏

dev*_*ull 26 c++ valgrind memory-leaks visual-studio-2010 visual-studio

在Linux中,我一直在使用valgrind来检查应用程序中是否存在内存泄漏.Windows中的等价物是什么?可以使用Visual Studio 2010完成吗?

Mal*_*ick 33

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;
}
Run Code Online (Sandbox Code Playgroud)

然后 :

  1. 在第一行“int a...”上放置一个断点
  2. 单击调试 > Windows > 显示诊断工具;并选择内存使用情况
  3. 然后调试代码(F5),当断点被命中时,点击Take snapshotMemory Usage summary 工具栏。
  4. 转到最后一行“返回0 ..”( (step overF10数次)和另一个快照。
  5. 单击第二个快照中的红色箭头(在内存使用选项卡中)
  6. 这将打开一个新的“快照”选项卡,允许您将此快照与第一个(或另一个)进行比较并检测内存泄漏。在此示例中,变量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;
}
Run Code Online (Sandbox Code Playgroud)

它做同样的事情,但通过代码,所以你可以将它集成到一个自动构建系统中,函数_CrtMemCheckpoint获取快照并_CrtMemDifference比较快照的内存状态,如果它们不同,则返回 true。

既然如此,它就会进入条件块并通过几个函数打印有关泄漏的详细信息(请参阅_CrtMemDumpStatistics_CrtMemDumpAllObjectsSince_CrtDumpMemoryLeaks - 后者不需要快照)。

要查看输出,请在最后一行“return 0”中放置一个断点,点击F5并查看调试控制台。这是输出:

在此处输入图片说明


要获取更多信息,请参阅以下链接:

  • 这 1000% 的工作量太大了。Windows 真的没有 valgrind 等效项吗? (2认同)

Def*_*ult 8

视觉检漏仪怎么样?它不是内置的,但我认为它是最受欢迎的.

  • 此后已转移到 https://kinddragon.github.io/vld/,然后在 2017 年显然被放弃。 (6认同)
  • 似乎仍然适用于 VS 2019,请参见此处:/sf/ask/4090780571/ detector-on-visual-studio-2019 (2认同)

ckv*_*ckv 0

您可以使用 DevPartner 工具通过 Visual Studio 查找 C++ 应用程序中的内存泄漏。