【问题标题】:A free() needed after malloc on mcu (even when the array/pointer is always in use)?在 mcu 上的 malloc 之后需要一个 free() (即使数组/指针总是在使用中)?
【发布时间】:2018-02-26 08:17:14
【问题描述】:

好吧,我是C的初学者,所以我可能还没有理解所有内容,所以我开始吧:

我们需要使用 c 编写一个没有任何 hal 库的 stm32f0。作为练习,我们需要将示例 usart 代码从顺序更改为中断驱动(对于接收部分)。现在这并不太难。另一个任务是添加一个先进先出缓冲区。 (实际分配说明我们需要使用大约 100 个字符的固定缓冲区大小)。我想实现一个动态缓冲区大小。一些谷歌搜索给了我使用指针并使用 malloc 为所需字符分配内存的答案。所以我这样做了:

volatile char *fifo_char_buffer;
void USART_init(int bufsize){
    fifo_char_buffer = (char *)malloc(bufsize * sizeof *fifo_char_buffer);
    //setting bunch of registers for usart1
}
//functions for writing/reading fifobuffer 

在微控制器上一切正常。但我开始阅读更多关于 malloc 的内容,发现在 malloc 之后执行 free 或多或少是强制性的。

现在我的问题是:由于当前状态下的缓冲区永远不会被一次全部清除,并且会持续使用直到您真正关闭设备,我真的需要释放该指针吗?据我所知,可能有限,每次重新启动 MCU 时,它都会再次执行所有分配,对吗?

【问题讨论】:

  • 只有在您不再需要该内存时才调用free()
  • 我会非常小心 uC 上的动态分配。通常堆很小,你还需要链接很多库。如果是 uC,你应该考虑其他方式。
  • 它是 C 还是 C++(不要在 C 中转换 malloc 的返回,你必须在 C++ 中转换它)?我想是 C,编辑过的标签。
  • 所有要说的:在这样的系统上,根本不要使用malloc 和朋友。它通常甚至没有实现,或者可能只是一个存根。你怎么知道,因为你甚至不检查错误?如果您一直需要该缓冲区,为什么要动态分配而不使用静态数组?

标签: c arrays pointers memory-management


【解决方案1】:

请注意,很多没有无限循环的非嵌入式程序也不调用free,它们只是调用exit,并且依赖于操作系统资源跟踪机制,但是如果重复使用这些代码必须重新编写在图书馆里,这里的做法很糟糕。

但是在嵌入式系统上,分配内存,然后启动主循环(它永远不会结束,除非它崩溃或手动重启)。

一旦程序处于“运行”状态,一些额外的规则(有时由操作系统强制执行)甚至会阻止您调用 malloc

所以在这种程序中永远不需要free

是的,当您重新启动设备时,操作系统会重新调用您的程序,并且 init 进程会再次分配内存,依此类推。

【讨论】:

  • 如果存在不明显的主循环。
  • “当前状态下的这个缓冲区永远不会被一次全部清除,并且会持续使用直到你真正关闭设备”。这似乎暗示某处存在无限循环。
  • @PeterJ_01 你几乎可以保证它存在,如果它的程序结束,一个微控制器不会“微控制”任何东西。
  • 谢谢,正是我正在寻找的那种答案,在某个地方不使用免费的感觉是错误的(可能是因为我去的任何地方都有人提到免费是必要的),但合乎逻辑说起来,我什至不知道我会把免费的东西放在哪里,所以我把它留了下来。现在我或多或少肯定我做了正确的事!
  • 裸机嵌入式系统也很少使用exit。它们通常会运行一个无限循环(某处,可能在 RTOS 中),直到断电。
【解决方案2】:

如前所述,免费并不是绝对必要的。但是,出于调试和维护目的,有相应的免费是很有用的。如果您的 malloc 调试工具说您没有出色的内存,那么您就知道您没有特定类别的错误。

【讨论】:

    猜你喜欢
    • 2019-04-18
    • 2021-11-27
    • 2016-03-28
    • 1970-01-01
    • 2011-03-22
    • 1970-01-01
    • 1970-01-01
    • 2021-05-24
    • 2011-10-28
    相关资源
    最近更新 更多