標籤:

c++怎麼檢測內存泄露,怎麼定位內存泄露?

面試時問到,因為我們公司項目檢查內存泄露都是都是通過資源管理器來的,定位主要是看log和review代碼。有沒有其他好的方法?

相關問題:C++不用工具,如何檢測內存泄漏?


只要每一個cpp在展開後都能看見這幾行(https://github.com/vczh-libraries/Vlpp/blob/master/Source/Basic.h):

#ifdef VCZH_CHECK_MEMORY_LEAKS
#define _CRTDBG_MAP_ALLOC
#include &
#include &
#define VCZH_CHECK_MEMORY_LEAKS_NEW new(_NORMAL_BLOCK, __FILE__, __LINE__)
#define new VCZH_CHECK_MEMORY_LEAKS_NEW
#endif

在程序退出的時候,調用_CrtDumpMemoryLeaks函數,Visual Studio的output窗口就會列印所有沒有釋放的東西(包括全局變數——所以不要在全局變數裡面使用非指針或數字類型),雙擊可以跳進代碼。

我都配置成debug模式會檢查,每次運行的時候都在檢查,有時候我都忘記他在檢查了然後突然就蹦出來了消息說我內存泄漏了,然後馬上改。所以我的程序絕對沒有內存泄漏(逃


如果是Windows的話可以利用在DEBUG環境下檢查

#ifdef _WIN32
#include &
#ifdef _DEBUG

#define new new(_NORMAL_BLOCK,__FILE__,__LINE__)
#endif
#endif

#ifdef _WIN32
_CrtSetDbgFlag(_CrtSetDbgFlag(_CRTDBG_REPORT_FLAG)|_CRTDBG_LEAK_CHECK_DF);
#endif


自己重載new操作符,用list或者map對分配的內存進行收集,如果釋放了,就刪除節點,最後檢測容器裡面還有沒有節點,有就是泄露了,你也可以記錄是哪一行的代碼分配的內存被泄露了,這都看你想要記錄什麼。最終可以生成報告給你自己去分析。


linux+gcc用valgrind,windows+msvc用vs調試功能。

如果是在windows上跑mingw就坑爹了,要麼買專門的商業檢測軟體,要麼用代碼侵入的方式,重載operator new,接入內存泄漏檢測代碼


windows下 可以試試 vld, dr memory,後者還可以檢測未初始化內存使用。


有個方法是自己接管內存分配,然後記錄調用內存分配的調用者返回地址,根據符號文件可以確認是哪個函數調用的,程序結束前看看哪些內存還在分配狀態,可以確認哪些函數分配內存沒有釋放。


有興趣的話可以看看這個:

https://github.com/google/sanitizers

裡面有很多很詳細的文檔。ASAN的話性能也是很不錯的,wiki裡面也有和其他工具的比較(比如:Valgrind)。


除非自己實現一個GC。內存泄漏的本質是分配了內存,沒有釋放,而且將來也不會再使用了。上面回答說重載new, malloc都是治標不治本的方法,即使你記錄了所有已分配的未釋放的內存塊,如果你沒有辦法判斷將來這塊內存是否會再被使用的話,你敢隨便釋放嗎?如果你能判斷出將來一定不會使用了,那麼等於你實現了一個GC。要解決這個問題只能從代碼編寫的規範來考慮,內存的分配和釋放控制在同一個scope裡面,盡量避免在一個函數裡面分配內存,再在另一個函數裡面去釋放。如果確實需要分配一塊內存作為運行時全局使用,可以考慮設置initialize和destroy方法分別在work flow開始和結束的時候調用。


如果是Windows,考慮下Visual Leak Detector,這個對泄露點信息定位相當不錯;如果是Linux,考慮下Valgrind,檢測內存使用以及線程方面的Bug功能非常強大。


C++ Bulilder 2007以上版本支持 ReporterMemoryLeakOnShutdown 變數,設置為 True 就能自動監測內存泄露。


gcc的asan

好像4.8以上的gcc自帶asan.

加編譯選項和鏈接asan庫就行,進程退出的時候,幫你列印出來所有申請未釋放的內存


編譯通過後,用cppcheck跑一遍,能解決不少代碼中明顯的內存泄漏。

運行的時候用valgrind跑,可以檢查運行時候存在的內存泄漏。


謝邀

據說這個很牛叉,坐等大佬來回答

既然已經C++了,反問為什麼不用智能指針管理,獲取資源即初始化RAII,離開作用域之後自動析構釋放內存


使用工具只能查出因為自己代碼造成的內存泄漏,對於因為錯誤調用系統API造成的內存泄漏還是只能通過查log和review代碼來定位,沒辦法。

PS:對於某人自以為高明刪評論的行為,請允許我豎一下中指!匿了


linux下有神器valgrind。

連用c++寫的各種matlab,python模塊都可以容易的找到內存泄漏點。


_CrtDumpMemoryLeaks();

IDE: VS2017 RC


前天剛剛跑出了內存溢出,我們的代碼集成到設備是要跑幾天的可靠性測試,和壓力測試,結果我的那部分當天晚上就炸了。所以多跑幾次壓力測試就好了。


推薦閱讀:

為什麼我覺得 Objective-C 的內存管理比 C++ 要複雜得多?這類語言是否是趨勢?
C++局部靜態變數的內存什麼時候創建的?
C++允許「我們都是人,所以我可以把你私有的眼睛借來隨便玩,再還給你」,這難道是一種設計上的妥協?
visual studio和gdb的調試機制到底是怎麼樣的?
C++不用工具,如何檢測內存泄漏?

TAG:C | 內存泄露 |