【发布时间】:2018-02-22 12:33:55
【问题描述】:
我在 RTOS 中有一个任务,在任务内部我分配了 5 次内存并释放了 3 次内存,但是如何在不使用外部工具的情况下找到内存泄漏?
【问题讨论】:
-
如果您有打印 - 尝试在分配后立即打印分配的指针(在每个分配操作上) - 并在每个
free命令之前打印指针。比较 malloc 和 free 的结果,通过一些打印,您也许可以了解它们未释放的流程 -
@Dagan 如果任务有很多分配和取消分配,打印消息很容易找到吗?
-
如果任务无限期运行,则无法检测到“泄漏”,因为无法自动确定任何特定分配在某些时候不会被释放。对于终止的任务,可以确定并非所有分配的内存都在终止时被释放,但任务通常不会以这种方式运行。
-
在 RTOS 系统上使用动态内存分配表明程序设计从根本上很糟糕。它不是个人电脑。所以泄漏是你的问题中最少的。通过编写一个有意义的程序来解决这个问题:使用堆栈或内存池等。
-
我完全同意伦丁的观点。这正是为什么有经验的嵌入式人员像瘟疫一样避免 malloc 和 free(或 new 和 delete)。它通常在嵌入式编码标准中被禁止。如果你想让某些东西在它所在的范围之外继续存在,请使用一个在启动时放置在堆上的全局变量,并且只有一次,或者构建你自己的迷你内存管理系统——一个数组,每个变量都有一个使用中的标志元素。