C 記憶體洩漏檢測方法

2021-08-14 15:11:53 字數 1302 閱讀 6446

原文參考引用自部落格:

c++中的記憶體洩露一般指堆中的記憶體洩露。堆記憶體是我們手動malloc/realloc/new申請的,程式不會自動**,需要呼叫free或delete手動釋放,否則就會造成記憶體洩露。記憶體洩露其實還應該包括系統資料的洩露,比如socket連線等,使用完後也要釋放。

記憶體洩露的原因:

總結下來,記憶體洩露大概有一下幾個原因:

1、編碼錯誤:malloc、realloc、new申請的內存在堆上,需要手動顯示釋放,呼叫free或delete。申請和釋放必須成對出現malloc/realloc對應free,new對應delete。前者不會執行構造/析構函式,後者會。對於c++內建資料型別可能沒差別,但是對於自己構造的類,可能在析構函式中釋放系統資源或釋放記憶體,所以要對應使用。

2、「無主」記憶體:申請記憶體後,指標指向記憶體的起始位址,若丟失或修改這個指標,那麼申請的記憶體將丟失且沒有釋放。

3、異常分支導致資源未釋放:程式正常執行沒有問題,但是如果遇到異常,正常執行的順序或分支會被打斷,得不到執行。所以在異常處理的**中,要確保系統資源的釋放。

4、隱式記憶體洩露:程式執行中不斷申請記憶體,但是直到程式結束才釋放。有些伺服器會申請大量記憶體作為快取,或申請大量socket資源作為連線池,這些資源一直占用直到程式退出。伺服器執行起來一般持續幾個月,不及時釋放可能會導致記憶體耗盡。

5、類的析構函式為非虛函式:析構函式為虛函式,利用多型來呼叫指標指向物件的析構函式,而不是基類的析構函式。

visual studio 中記憶體洩漏檢測方法,可由具體**中體現:

#include "stdafx.h"

#include //可以定位到發生記憶體洩露 所在的檔案和具體那一行,用於檢測 malloc 分配的記憶體

#define _crtdbg_map_alloc

#include #include //把分配記憶體的資訊儲存下來,可以定位到那一行發生了記憶體洩露。用於檢測 new 分配的記憶體

#ifdef _debug

#define new new(_normal_block, __file__, __line__)

#endif

//important

inline void enablememleakcheck()

int _tmain(int argc, _tchar* argv)

bingo!最後執行結果,檢測到記憶體洩漏,並且定位到具體哪乙個檔案,哪一行**。

C 記憶體洩漏檢測

include stdafx.h ifdef debug define debug new new normal block,file line 重新定義new用於記憶體洩漏檢測時輸出行號 define debug malloc s malloc dbg s,normal block,file li...

C 記憶體洩漏檢測

今天寫乙個程式突然想檢測一下是否有記憶體洩漏,於是上網查了一下,大多數都是一種方法。只是實現略有不同,記錄如下。在你想檢測的地方都必須包含 define crtdbg map alloc include include 在程式末尾加上 crtdumpmemoryleaks debug除錯後,如果有記...

C語言記憶體洩漏檢測方法

記憶體洩漏是c語言程式設計中乙個很常見的問題,而且由於記憶體洩漏所導致的問題出現較緩慢,所以不容易覺察,所以寫乙個簡單的程式來檢測記憶體洩漏很有必要。記憶體洩漏通常是指堆記憶體的洩漏,也就是通過malloc calloc函式申請的記憶體,因此記憶體洩漏的檢測方法核心思想就是通過巨集定義自定義記憶體分...