本篇先后介紹在windows中使用visual studio定位未釋放的內存、在linux中使用valgrind定位未釋放的內存。
Windows+Visual Studio 2015 (企業版)
准備好測試程序后,點擊“分析”-“性能探查器”
勾選“內存使用率”,點擊“開始”
程序進入運行狀態。點擊“拍攝快照”,分析器會將當前的內存使用情況保存到一個快照里。
根據情況,創建多個快照,以便於查看相鄰快照的內存變化情況。點擊“停止”,出現如下所示界面。
紅框處的表示相比上一次快照,內存的變化情況。點擊該文字,可以進入詳細情況查看頁,可以看到增加(如果有的話)的字節是在哪被分配的。
Linux環境中
需要借助開源工具 valgrind 。經測試,該工具最新版(22 June 2020)在Redhat 6.4環境中可用。若要用得順暢,可能需要一點英語能力。
該工具的最大優點是非侵入式的,即無需修改原測試程序就可以檢測內存占用。但需要編譯測試程序時的g++命令帶上 -g 選項。
下載頁面網址:https://www.valgrind.org/downloads/current.html#current 。
懶人地址:https://sourceware.org/pub/valgrind/valgrind-3.16.1.tar.bz2
下載完成后,安裝很簡單,根據Readme里的指引來就行,有如下三步
- ./configure
- make
- make install
然后可以直接使用valgrind了。使用前檢查是否真的安裝成功:valgrind --leak-check=full ls -l
使用該工具的常用格式是:valgrind --tool=memcheck --leak-check=full [程序名] [程序運行參數]
可以通過 valgrind --help 查看幫助。
在程序運行過程中,valgrind會將內存使用不當的地方輸出;當程序運行完成或中斷后,valgrind會將可能有內存未釋放的地方列出來。
為了防止valgrind的輸出和程序的輸出混在一起,可以給valgrind命令添加--log-file選項,將valgrind的輸出定向到文件中,這樣就可以直接在這個文件中查看日志使用情況了。
如:valgrind --tool=memcheck --leak-check=full --log-file=valgrind.log [程序名] [程序運行參數]