問(wèn)題描述
在 Linux 中,我一直使用 valgrind 來(lái)檢查應(yīng)用程序中是否存在內(nèi)存泄漏.Windows 中的等價(jià)物是什么?這可以用 Visual Studio 2010 完成嗎?
Visual Studio 2019 有一個(gè)不錯(cuò)的內(nèi)存分析工具,它可以在調(diào)試時(shí)交互使用或通過(guò)編程(無(wú)需調(diào)試)使用,我在這兩種情況下都展示了一個(gè)最小的例子在下面.
主要思想是在進(jìn)程開(kāi)始和結(jié)束時(shí)對(duì)堆進(jìn)行快照,然后比較內(nèi)存狀態(tài)以檢測(cè)潛在的內(nèi)存泄漏.
交互式
創(chuàng)建以下 main.cpp
文件(在新的控制臺(tái)應(yīng)用程序中):
#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..."上放置一個(gè)斷點(diǎn)
- 點(diǎn)擊調(diào)試>窗口 >顯示診斷工具;并選擇內(nèi)存使用情況
- 然后調(diào)試代碼(F5),當(dāng)斷點(diǎn)被命中時(shí),點(diǎn)擊內(nèi)存使用情況摘要工具欄上的
Take snapshot
. - 轉(zhuǎn)到最后一行return 0.."(
跳過(guò)
(F10)幾次)并拍攝另一個(gè)快照. - 點(diǎn)擊第二個(gè)快照中的紅色箭頭(在內(nèi)存使用選項(xiàng)卡中)
- 這將打開(kāi)一個(gè)新的快照";選項(xiàng)卡,允許您將此快照與第一個(gè)(或另一個(gè))進(jìn)行比較并檢測(cè)內(nèi)存泄漏.在此示例中,變量
s
(stackoverflow_pb) 存在內(nèi)存泄漏.您可以通過(guò)雙擊char[]"找到它.對(duì)象.
以上過(guò)程的關(guān)鍵步驟如下圖所示:
通過(guò)編程
將代碼替換為以下內(nèi)容:
#include #include windows.h"#define _CRTDBG_MAP_ALLOC//獲取更多細(xì)節(jié)#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;}
它做同樣的事情,但通過(guò)代碼,所以你可以將它集成到自動(dòng)構(gòu)建系統(tǒng)中,功能
要獲取更多信息,請(qǐng)參閱以下鏈接:
- 交互式分析:測(cè)量 Visual Studio 中的內(nèi)存使用情況
- 通過(guò)編程:使用 CRT 庫(kù)查找內(nèi)存泄漏 和 CRT 調(diào)試堆文件(也用于堆損壞)
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)
這篇關(guān)于使用 Visual Studio 在 C++ 應(yīng)用程序中查找內(nèi)存泄漏的文章就介紹到這了,希望我們推薦的答案對(duì)大家有所幫助,也希望大家多多支持html5模板網(wǎng)!