使用CRT除錯記憶體分配堆來找出未釋放的記憶體空間

2021-08-28 17:54:00 字數 1594 閱讀 5229

忘記釋放已經分配的記憶體是一種常見的程式設計錯誤,當然我指的是在c++程式設計當中,例如下面的**裡面就存在乙個忘記釋放記憶體的程式設計錯誤。我個人覺得忘記釋放記憶體的程式設計錯誤是不可避免的,畢竟程式設計師都是人,困了,心情不好了,**過於複雜啦等等都可能導致忘記加上一句delete ***語句。

#include #include #include #include using namespace std;

class ctestclass

~ctestclass()

void printname()

private:

wstring *m_lpname;

};hresult createtestclass(lpwstr szname, ctestclass **ppobject)

int _tmain(int argc, _tchar* argv)

else

}

實際上visual studio已經提供了方法幫助你快速找到這些沒有釋放的記憶體。

visual studio提供了一系列的crt除錯api,crt提供了乙個除錯記憶體分配堆,可以跟蹤和管理內存在什麼地方分配,當你在這個堆上分配記憶體的時候,每一次記憶體分配呼叫例如malloc或者new,crt都會額外分配大約36個位元組用來儲存例如這個記憶體塊分配的檔名、行號、記憶體塊的大小等資訊,最後crt將這些記憶體塊使用乙個雙鏈表鏈結起來。每一次記憶體釋放的時候,free或者delete函式就從這個記憶體塊鍊錶裡面將要釋放的記憶體塊刪除,因此在需要檢查記憶體洩漏的時候,只要遍歷這個雙鏈表依次列印出這些記憶體塊就可以發現所有未釋放的記憶體了。下面是crt記憶體塊的原始宣告:

typedef struct _crtmemblockheader

_crtmemblockheader;

下面的**演示了如何使用crt提供的除錯api來修改剛才的原始檔檢測未釋放的記憶體空間(注意紅色新增的部分):

#include #include #include #include // 使用crt除錯api

#include using namespace std;

// 將所有的記憶體分配函式new替換成crt提供的除錯new

#ifdef _debug

#define debug_clientblock new(_client_block, __file__, __line__)

#else

#define debug_clientblock

#endif

#ifdef _debug

#define new debug_clientblock

#endif

class ctestclass

~ctestclass()

void printname()

private:

wstring *m_lpname;

};hresult createtestclass(lpwstr szname, ctestclass **ppobject)

int _tmain(int argc, _tchar* argv)

else

}

記憶體洩漏除錯(1) CRT

記憶體洩漏 c run time libraries crt 設定斷點 記憶體洩漏的簡單定義是沒有正確的釋放已經分配的記憶體,這在c c 程式中是乙個很難檢測的bug 一塊較小的記憶體洩漏可能很容易被忽視,但如果記憶體洩漏的現象不斷積累,後果可能導致程式的崩潰,甚至還會影響到其他程式的執行,所以記憶...

記憶體的堆分配和棧分配

記憶體的堆分配和棧分配 備註 這一部分非常重要,如果錯誤請及時告知。謝謝 這裡是完全參考其他部落格。c 記憶體模型 1 棧區 由編譯器自動分配和釋放,存放函式的引數數值,區域性變數的值 其操作方式類似於資料結構中的棧 2 堆區 一般由使用者分配和釋放,若使用者不釋放,程式結束時候由os 它與資料結構...

記憶體的堆分配和棧分配

c 記憶體模型 1 棧區 由編譯器自動分配和釋放,存放函式的引數數值,區域性變數的值 其操作方式類似於資料結構中得棧 2 堆區 一般由使用者分配和釋放,若使用者不釋放,程式結束時候由os 它與資料結構中堆是兩回事,分配方式類似鍊錶 3 全域性區 靜態區 static 全域性變數和靜態變數的存放區域。...