過載new和delete來檢測記憶體洩漏

2022-03-19 10:49:02 字數 2131 閱讀 2942

1. 簡述

2. 基本原理

記憶體洩漏就是new出來的記憶體沒有通過delete合理的釋放掉。new和delete這兩個函式就是關鍵點。可以過載new和delete,每次new中開闢一塊記憶體就用鍊錶把這個記憶體的資訊儲存下來,每次用delete刪除一塊記憶體就從鍊錶中刪除這塊記憶體的記錄。

3. **樣例

輸出結果為:

可見97行開闢的int,沒有delete掉,輸出結果也顯示為97行。

4. **說明

4.1 關於new的引數問題。

對於new int,編譯器會解釋為new(sizeof(int)),對於new int[5],編譯器會解釋為new(sizeof(int)*5)。因此使用巨集定義預編譯後,new int就變為new (__file__,__line__) int,編譯器會解釋為new(sizeof(int), __file__,__line__)。

4.2 關於memstack

memstack內部也是乙個鍊錶結構,注意內部實現不能使用new和delete,只能使用malloc和free來實現鍊錶,因為待測**中的過載new和delete中呼叫了memstack的insert和delete函式,如果insert和delete函式也呼叫過載後的new和delete的話,會構成死迴圈的,所以直接使用free和malloc比較好。

memstack中的析構函式,會釋放掉洩漏掉的記憶體。

5. 使用思考

對於常發性和一次性的記憶體洩漏**,直接放入測試就好了。對於偶發性的記憶體洩漏**,只要滿足特定條件,那麼也就轉化為常發性或者一次性的記憶體洩漏了。

對於隱式記憶體洩漏,由於程式是在很長一段時間之後導致記憶體耗盡,我們需要長時間觀察,每隔一段時間比較一下記憶體的使用量,如果在乙個較長的時間內,記憶體使用量持續增加,那麼可以考慮是記憶體洩漏。不過除錯起來可能會比較麻煩,還是需要重新審視程式設計的。

6. 參考

如何檢查記憶體洩漏-過載new和delete:十分生動的說明。

乙個跨平台的c++記憶體洩漏檢測器:十分專業化的講解和實現。

1. 簡述

2. 基本原理

記憶體洩漏就是new出來的記憶體沒有通過delete合理的釋放掉。new和delete這兩個函式就是關鍵點。可以過載new和delete,每次new中開闢一塊記憶體就用鍊錶把這個記憶體的資訊儲存下來,每次用delete刪除一塊記憶體就從鍊錶中刪除這塊記憶體的記錄。

3. **樣例

輸出結果為:

可見97行開闢的int,沒有delete掉,輸出結果也顯示為97行。

4. **說明

4.1 關於new的引數問題。

對於new int,編譯器會解釋為new(sizeof(int)),對於new int[5],編譯器會解釋為new(sizeof(int)*5)。因此使用巨集定義預編譯後,new int就變為new (__file__,__line__) int,編譯器會解釋為new(sizeof(int), __file__,__line__)。

4.2 關於memstack

memstack內部也是乙個鍊錶結構,注意內部實現不能使用new和delete,只能使用malloc和free來實現鍊錶,因為待測**中的過載new和delete中呼叫了memstack的insert和delete函式,如果insert和delete函式也呼叫過載後的new和delete的話,會構成死迴圈的,所以直接使用free和malloc比較好。

memstack中的析構函式,會釋放掉洩漏掉的記憶體。

5. 使用思考

對於常發性和一次性的記憶體洩漏**,直接放入測試就好了。對於偶發性的記憶體洩漏**,只要滿足特定條件,那麼也就轉化為常發性或者一次性的記憶體洩漏了。

對於隱式記憶體洩漏,由於程式是在很長一段時間之後導致記憶體耗盡,我們需要長時間觀察,每隔一段時間比較一下記憶體的使用量,如果在乙個較長的時間內,記憶體使用量持續增加,那麼可以考慮是記憶體洩漏。不過除錯起來可能會比較麻煩,還是需要重新審視程式設計的。

6. 參考

如何檢查記憶體洩漏-過載new和delete:十分生動的說明。

乙個跨平台的c++記憶體洩漏檢測器:十分專業化的講解和實現。

如何檢測記憶體洩漏 過載new和delete

另外1個鏈結 這種方式的記憶體洩露的檢查還是比較好辦的,首先過載 new delete 或 malloc free void cdecl operator new size t nsize,lpcstr lpszfilename,int nline void cdecl operator delet...

過載new和delete來防止c 工程中記憶體洩漏

在c c 中指標給編碼帶來的極大的方便,但是同時由於分配的指標需要程式設計人員自行釋放記憶體,因此容易造成記憶體洩漏,c 中自帶的new delete本身沒有提供記憶體洩漏檢測的功能,不過我們可以過載這兩個函式來追蹤記憶體的分配和釋放,以此來檢測程式是否出現了記憶體洩漏。演算法的思想是在new一塊記...

過載C 的new和delete

過載c c 標準庫的記憶體管理函式 比如malloc,free,operator new,operator delete,operator new,operator delete 時,編譯器會忽視重定義,所以不用擔心鏈結時會產生重定義錯誤。operator new,operator delete,o...