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)
然后 :
Take snapshot
Memory Usage summary 工具栏。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;
}
Run Code Online (Sandbox Code Playgroud)
它做同样的事情,但通过代码,所以你可以将它集成到一个自动构建系统中,函数_CrtMemCheckpoint
获取快照并_CrtMemDifference
比较快照的内存状态,如果它们不同,则返回 true。
既然如此,它就会进入条件块并通过几个函数打印有关泄漏的详细信息(请参阅_CrtMemDumpStatistics、_CrtMemDumpAllObjectsSince和_CrtDumpMemoryLeaks - 后者不需要快照)。
要查看输出,请在最后一行“return 0”中放置一个断点,点击F5
并查看调试控制台。这是输出:
要获取更多信息,请参阅以下链接:
归档时间: |
|
查看次数: |
72769 次 |
最近记录: |