詳解windows下C C 的記憶體洩露檢測

2022-09-25 01:21:09 字數 2298 閱讀 3329

利用visual studio偵錯程式和crt庫提供的檢測(malloc和new均適用)

程式只從單一位置退出時:

1.需要以下標頭檔案:

#define _crtdbg_map_alloc

#include

#include

通過包含crtdbg.h,將malloc和free分別對映到_malloc_dbg和_free_dbg,用於記憶體分配和釋放的跟蹤。

#define _crtdbg_map_alloc語句用於提供額外的資訊,非絕對必要。

2.在程式退出位置前使用以下語句:

_crtdumpmemoryleaks();

該語句會在輸出視窗顯示記憶體洩露資訊。

測試**

#define _crtdbg_map_alloc

#include

#include

#include

#define num 10

int main()

輸出結果

使用_crtdbg_map_alloc時:

未使用_crtdbg_map_alloc時:

如果將程式中的:

char *test;

test = (char*)malloc(num * sizeof(char));

替換為:

char* name = new char[10];

也會得到同樣的結果(記憶體位置由於自動分配有所不同):

程式從多個位置退出時:

1.同樣包含上述標頭檔案

2.在每個會退出程式的函式(包括main函式)開始處包含以下**:

_crtsetdbgflag(_crtdbg_alloc_mem_df | _crtdbg_leak_check_df);

程式會在退出時自動呼叫_crtdumpmemoryleaks();。

測試**

#define _crtdbg_map_alloc

#include

#include

#include

#define num 10

void test1();

void test2();

int main()

void test1()

void test2()

輸出結果

當程式不大時,記憶體洩露位置可以輕易通過肉眼分辨或者**審計發現。但是當程式較大的時候,就難以發現具體發生記憶體洩露的位置。此時可以通過crt庫的_crtmenstate結構儲存記憶體狀態。

使用該結構型別需要定義變數用於儲存記憶體狀態:

_crtmenstate s1,s2,s3;

檢測指定位置記憶體需要用到_crtmencheckpoint結構:

_crtmencheckpoint(&s1);

該語句將當前位置的記憶體狀態傳遞到_crtmenstate結構變數s1中。

檢測兩個位置之間的記憶體狀態需要用到_crtmendifference()函式,同時需要乙個新的_crtmenstate結構變數用於儲存狀態之間的差異:

_crtmemcheckpoint( &s1 );

_crtmemcheckpoint( &s2 );mukwyqsl

_crtmemdifference( &s3, &s1, &s2);

轉儲_crtmenstate結構的內容需要用到_crtmemdumpstatistics函式:

_crtmendumpstatics(&s3);

測試**

#define _crtdbg_map_alloc

#include程式設計客棧dio.h>

#include

#include

#define num 10

_crtmemstate s1, s2, s3;

void mem(char *str, int n);

int main()

void mem(char *str, int n)

輸出結果

當s1和s2之間呼叫了函式men()時:

當刪去程式中的

men(test, num);

即s1和s2之間沒有呼叫men()函式時:

如果單純使用_crtdumpmemoryleaks();,只能顯示記憶體分配的位置,即函式men()中分配記憶體語句的位置,而不能定位到是哪一次對函式men()呼叫導致的記憶體洩露,而通過結構_crtmenstate,可以得到語句之間是否存在記憶體分配,從而定位出記憶體洩露的位置。

記憶體洩露的原因很簡單,無非就是分配了記憶體而沒有釋放,為了解決這個問題,除了養成良好的習慣,還有要善用工具在編寫程式的時候程式設計客棧實時監測是否出現記憶體洩露,減少後期排bug時的工作量。

C C 的記憶體分配詳解

乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放,存放區域性變數的值等。其操作方式類似於資料結構中的棧。2 堆區 heap 一般由程式設計師分配釋放 new或malloc sizeof xx delete 或free 若程式設計師不釋放,程式結束時可能...

C C 記憶體對齊詳解

如果體系結構是不對齊的,a中的成員將會乙個挨乙個儲存,從而可能出現sizeof a 為11的情況。如果按照4位元組倍數對齊,這時候sizeof a 結果是12,顯然對齊更浪費了空間。那麼為什麼要使用對齊呢?體系結構的對齊和不對齊,是在時間和空間上的乙個權衡,對齊可以節省cpu訪問資料的時間。假設乙個...

windows下的C C 精確計時

由於我要測試線性篩法的速度,用上了c c 精確計時.此時傳統的clock 方法不夠用了,我們需要另一種測量的辦法,即cputicks cpufreq.如何實現呢?include large integer freq,start,stop queryperformancefrequency freq ...