内存泄露问题是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之后,内存泄露就解决了。
记录自己踩过的坑,积累经验。