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

单片机C语言几种内存泄露总结,第1张

  linuxc语言内存泄漏总结

  内存泄露问题是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语言几种内存泄露总结,单片机C语言几种内存泄露总结,第2张

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

  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线程,但是忘记联接它,其资源或私有内存一直保存在进程空间中,从未进行回收再利用。一定要联接可接合的线程;否则,可能会引起严重的内存泄漏问题。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/dianzi/2717091.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-08-17
下一篇 2022-08-17

发表评论

登录后才能评论

评论列表(0条)

保存