問題描述
在 Linux 中,我一直使用 valgrind 來檢查應用程序中是否存在內存泄漏.Windows 中的等價物是什么?這可以用 Visual Studio 2010 完成嗎?
Visual Studio 2019 有一個不錯的內存分析工具,它可以在調試時交互使用或通過編程(無需調試)使用,我在這兩種情況下都展示了一個最小的例子在下面.
主要思想是在進程開始和結束時對堆進行快照,然后比較內存狀態以檢測潛在的內存泄漏.
交互式
創建以下 main.cpp
文件(在新的控制臺應用程序中):
#include int main(){int a = 1;字符* s = 新字符[17];strcpy_s(s,17,stackoverflow_pb");字符* ss = 新字符[14];strcpy_s(ss, 14, stackoverflow");刪除[] ss;返回0;}
然后:
- 在第一行int a..."上放置一個斷點
- 點擊調試>窗口 >顯示診斷工具;并選擇內存使用情況
- 然后調試代碼(F5),當斷點被命中時,點擊內存使用情況摘要工具欄上的
Take snapshot
. - 轉到最后一行return 0.."(
跳過
(F10)幾次)并拍攝另一個快照. - 點擊第二個快照中的紅色箭頭(在內存使用選項卡中)
- 這將打開一個新的快照";選項卡,允許您將此快照與第一個(或另一個)進行比較并檢測內存泄漏.在此示例中,變量
s
(stackoverflow_pb) 存在內存泄漏.您可以通過雙擊char[]"找到它.對象.
以上過程的關鍵步驟如下圖所示:
通過編程
將代碼替換為以下內容:
#include #include windows.h"#define _CRTDBG_MAP_ALLOC//獲取更多細節#include #include //用于malloc和freeint main(){_CrtMemState 已售出;_CrtMemState sNew;_CrtMemState sDiff;_CrtMemCheckpoint(&sOld);//拍攝快照字符* s = 新字符[17];strcpy_s(s, 17, stackoverflow_pb");字符* ss = 新字符[14];strcpy_s(ss, 14, stackoverflow");刪除[] ss;_CrtMemCheckpoint(&sNew);//拍攝快照if (_CrtMemDifference(&sDiff, &sOld, &sNew))//如果有差異{OutputDebugString(L"-----------_CrtMemDumpStatistics ---------");_CrtMemDumpStatistics(&sDiff);OutputDebugString(L"-----------_CrtMemDumpAllObjectsSince ---------");_CrtMemDumpAllObjectsSince(&sOld);OutputDebugString(L"-----------_CrtDumpMemoryLeaks ---------");_CrtDumpMemoryLeaks();}返回0;}
它做同樣的事情,但通過代碼,所以你可以將它集成到自動構建系統中,功能
要獲取更多信息,請參閱以下鏈接:
- 交互式分析:測量 Visual Studio 中的內存使用情況
- 通過編程:使用 CRT 庫查找內存泄漏 和 CRT 調試堆文件(也用于堆損壞)
In Linux, I have been using valgrind for checking if there are memory leaks in an application. What is the equivalent in Windows? Can this be done with Visual Studio 2010?
Visual Studio 2019 has a decent memory analysis tool, it may be used interactively while debugging or by programming (without debugging), I show a minimal example in both cases in the following.
The main idea is to take a snapshot of the heap at the beginning and at the end of the process, then to compare the states of memory to detect potential memory leaks.
Interactively
Create the following main.cpp
file (in a new console application) :
#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;
}
Then :
- Put a breakpoint on the first line "int a..."
- Click Debug > Windows > Show Diagnostic Tools; and pick memory usage
- Then debug the code (F5), when the breakpoint is hit, click
Take snapshot
on the Memory Usage summary toolbar. - Go to the last line "return 0.." (
step over
(F10) several times) and take another snapshot. - Click on the red arrow in the second snapshot (in memory usage tab)
- this will open a new "snapshot" tab that permits you to compare this snapshot with the first one (or another one) and to detect memory leaks. In this example there is a memory leak for variable
s
(stackoverflow_pb). You can find it by double click the "char[]" object.
The key steps of the above procedure are shown in the following image:
By programming
Replace the code with the following:
#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;
}
It does the same thing but by code, so you can integrate it in an automatic build system, the functions _CrtMemCheckpoint
take the snapshots and _CrtMemDifference
compare the memory states of snapshot and returns true is they are different.
Since it is the case, it enters the conditional block and prints details about the leaks via several functions (see _CrtMemDumpStatistics , _CrtMemDumpAllObjectsSince and _CrtDumpMemoryLeaks - the latter doesn't require snapshots).
To see the output, put a break point in the last line "return 0", hit F5
and look at the debug console. Here is the output :
To get more information, see the following links :
- Interactive analysis : Measure memory usage in Visual Studio
- via programming : Find memory leaks with the CRT library and CRT debug Heap Files (for heap corruption also)
這篇關于使用 Visual Studio 在 C++ 應用程序中查找內存泄漏的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!