記憶體洩露問題是c語言很容易出現的問題,小程式可以很容易的發現,但是大程式就比較難發現了。
記憶體洩露是由于動态配置設定的記憶體沒有被釋放,可以使用valgrind等工具檢查出來。
常見導緻記憶體洩露的函數有malloc、calloc,以及間接使用malloc的函數strdup、strndup等。還包括mmap函數。
要避免記憶體洩漏需要以下函數成對出現:
malloc/free
calloc/free
strdup/free
strndup/free
mmap/munmap
<以後遇到坑,繼續添加>
我遇到的問題是遇到了記憶體洩漏,但是valgrind沒有查出來有malloc未被釋放的。結果是由于mmap沒有釋放導緻的。
$ valgrind --leak-check=yes --leak-check=full --show-leak-kinds=all ./bin/ap_collector > lost.log 2>&1
分析結果如下圖:
盡管沒有查出來記憶體洩漏,但是記憶體還是在快速持續增長。後來自己分析:
1、記憶體持續增長:定位基本上都發生在while循環内。
2、記憶體塊速增長:說明有大量記憶體塊被申請,沒有釋放。
3、沒有malloc和strdup的記憶體洩漏:說明需要檢視其它函數是否有申請大塊記憶體。
于是基于以上幾點分析,檢查了我的循環處理邏輯中的代碼,發現mmap申請的記憶體忘記釋放了,添加munmap之後,記憶體洩露就解決了。
記錄自己踩過的坑,積累經驗。