自己遇到的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

分析結果如下圖:


儘管沒有查出來內存泄漏,但是內存還是在快速持續增長。後來自己分析:

1、內存持續增長:定位基本上都發生在while循環內。

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

3、沒有malloc和strdup的內存泄漏:說明需要查看其它函數是否有申請大塊內存。

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


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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章