天天看點

自己遇到的linux下c語言記憶體洩漏總結

記憶體洩露問題是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
           

分析結果如下圖:

自己遇到的linux下c語言記憶體洩漏總結

盡管沒有查出來記憶體洩漏,但是記憶體還是在快速持續增長。後來自己分析:

1、記憶體持續增長:定位基本上都發生在while循環内。

2、記憶體塊速增長:說明有大量記憶體塊被申請,沒有釋放。

3、沒有malloc和strdup的記憶體洩漏:說明需要檢視其它函數是否有申請大塊記憶體。

于是基于以上幾點分析,檢查了我的循環處理邏輯中的代碼,發現mmap申請的記憶體忘記釋放了,添加munmap之後,記憶體洩露就解決了。

記錄自己踩過的坑,積累經驗。

繼續閱讀