单片机C语言几种内存泄露总结

编程语言及工具

102人已加入

描述

  linux下c语言内存泄漏总结

  内存泄露问题是c语言很容易出现的问题,小程序可以很容易的发现,但是大程序就比较难发现了。

  内存泄露是由于动态分配的内存没有被释放,可以使用valgrind等工具检查出来。

  常见导致内存泄露的函数有malloc、calloc,以及间接使用malloc的函数strdup、strndup等。还包括mmap函数。

  要避免内存泄漏需要以下函数成对出现:

  malloc/free

  calloc/free

  strdup/free

  strndup/free

  mmap/munmap

  我遇到的问题是遇到了内存泄漏,但是valgrind没有查出来有malloc未被释放的。结果是由于mmap没有释放导致的。

  [plain] view plain copy$ valgrind --leak-check=yes --leak-check=full --show-leak-kinds=all 。/bin/ap_collector 》 lost.log 2》&1

  分析结果如下图:

  C语言

  尽管没有查出来内存泄漏,但是内存还是在快速持续增长。后来自己分析:

  1、内存持续增长:定位基本上都发生在while循环内。

  2、内存块速增长:说明有大量内存块被申请,没有释放。

  3、没有malloc和strdup的内存泄漏:说明需要查看其它函数是否有申请大块内存。

  于是基于以上几点分析,检查了我的循环处理逻辑中的代码,发现mmap申请的内存忘记释放了,添加munmap之后,内存泄露就解决了。

  单片机C语言几种内存泄露总结

  日常项目中碰到的内存泄露无非有以下几种:

  (1) 堆内存泄漏(Heap leak)。堆内存指的是程序运行中根据需要分配通过malloc,realloc new等从堆中分配的一块内存,再是完成后必须通过调用对应的 free或者delete 删掉。如果程序的设计的错误导致这部分内存没有被释放,那么此后这块内存将不会被使用,就会产生Heap Leak. 这是最常见的内存泄露。

  (2)系统资源泄露(Resource Leak)。主要指程序使用系统分配的资源比如 Bitmap,handle ,SOCKET等没有使用相应的函数释放掉,导致系统资源的浪费,严重可导致系统效能降低,系统运行不稳定

  如果您创建一个可接合的POSIX线程,但是忘记联接它,其资源或私有内存一直保存在进程空间中,从未进行回收再利用。一定要联接可接合的线程;否则,可能会引起严重的内存泄漏问题。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分