內存泄露問題是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之後,內存泄露就解決了。
記錄自己踩過的坑,積累經驗。