繼上次重載operator new檢測內存泄漏失敗之后,妥協了。決定不管是否是准確指明哪一行代碼出現內存泄漏,只要告訴我是否有泄漏就行了,這樣就沒有new替換的問題。在開發中,總是一個個小功能的開發。如果開發完一個小功能告訴我有內存泄漏,那想必也是比較容易找的。
這次的想法是重寫operator new,然后每次new的時候記錄一下地址及申請內存的大小,釋放時刪除記錄。這樣,程序結束時剩余的記錄就是泄漏的了。記錄的數據結構首選STL的map。結果,在記錄時,map需要申請內存,調用new,new需要調用map來記錄...居然成了死循環。又得放棄了。
不過總得有個方案檢測程序的內存泄漏啊。malloc_hook、mtrace、valgrind得選一個了。感覺malloc_hook有點類似重寫operator new,不想用。mtrace每次要生成文件記錄,不方便經常調試。也只有valgrind一個選擇了。之前不用valgrind是因為自己代碼用的庫比較多,libev、boost、STL...,其中libev文檔指明valgrind對它的檢測結果有誤,所以開始不用。不過現在也無所謂了,知道有這么回事就好。
Qt creator和valgrind是分開的,確保已安裝valgrind,沒安裝的請sudo apt-get install valgrind。
故意寫了內存泄漏的代碼“char *pttt = new char[1024];”:
點擊Qt creator 中的分析菜單,選中Valgrind Memory Analyzer
Qt creator 會調用valgrind自動分析中,如果程序比較大,可能會很慢
可見valgrind可以將基本的內存泄漏分析出來。但是,工具檢測只是提供了參考,對於復雜的程序,尤其是使用了內存池的程序。重要的還是自己寫代碼時注意。