檢測內存洩漏的方法多種多樣,有使用內存洩漏檢測工具(比如BoundsChecker)檢測內存洩漏;有直接看代碼檢測代碼邏輯,看那些地方是否沒有釋放內存。一般地靜態內存洩漏通過工具與代碼檢查很容易找到洩漏點;動態的內存洩漏很難查,一般通過在代碼中加斷點跟蹤和Run-Time內存檢測工具來查找。
總的來說,要檢查內存洩漏分幾個步驟:
1、首先寫代碼時要控制內存的釋放,比如new之後要delete,看析構函數是否真的執行(很多人編寫釋放內存的代碼在析構函數中處理的),如果沒有真正執行,就需要動態釋放對象;前段時間在一個項目中使用了單例模式對象,將構造函數和析構函數設置成保護類型,在運行代碼時退出時不執行到析構函數裡面(具體也不知道什麼原因),最後只有手動刪除對象。
2、其次讓程序長時間運行,看任務管理器對應程序內存是不是一直向上增加;
3、最後使用常用內存洩漏檢測工具來檢測內存洩漏點。
文本主要描述一些內存洩漏檢測工具功能介紹與簡單使用方法。
一、對於VS2005/VS2008編譯器自帶的內存檢測工具/函數。
在 main() 函數開頭加上:
#include "crtdbg.h"
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF|_CRTDBG_LEAK_CHECK_DF);
二、用BoundsChecker之類的工具。
BoundsChecker 是一個Run-Time錯誤檢測工具,它主要定位程序在運行時期發生的各種錯誤。BoundsChecker能檢測的錯誤包括:
1、指針操作和內存、資源洩露錯誤,比如:
內存洩露;
資源洩露;
對指針變量的錯誤操作。
2、內存操作方面的錯誤,比如:
內存讀、寫溢出;
使用未初始化的內存。
3、API函數使用錯誤
具體詳細信息參考:http://www.BkJia.com/kf/201104/89133.html
三、linux下可以用valgrind檢測內存洩露錯誤。
具體詳細信息參考:http://www.BkJia.com/kf/201104/89135.html
四、purify工具,這個是專門檢測內存的,包括洩露、越界、指針跑飛等都可以檢查,在VC上使用方便。
五、用Windbg,試過查句柄洩漏的,比較方便。
六、Visual Leak Detector
Visual Leak Detector是一款用於Visual C++的免費的內存洩露檢測工具。可以在http://www.codeproject.com/tools/visualleakdetector.asp 下載到。相比較其它的內存洩露檢測工具,它在檢測到內存洩漏的同時,還具有如下特點:
1、 可以得到內存洩漏點的調用堆棧,如果可以的話,還可以得到其所在文件及行號;
2、 可以得到洩露內存的完整數據;
3、 可以設置內存洩露報告的級別;
4、 它是一個已經打包的lib,使用時無須編譯它的源代碼。而對於使用者自己的代碼,也只需要做很小的改動;
5、 他的源代碼使用GNU許可發布,並有詳盡的文檔及注釋。對於想深入了解堆內存管理的讀者,是一個不錯的選擇。
具體詳細信息參考:aspx">http://www.codeproject.com/KB/applications/visualleakdetector.aspx