为什么free()函数不能在我的Arduino Uno上释放内存?

4
我正在尝试使用free()函数在变量使用后将其删除以释放RAM,但我的RAM并未进行清理。我猜测没有垃圾清理正在进行?空间在我退出代码部分(作用域if语句、while循环或函数)后会清理,但不会在free()语句本身之后清理。我正在执行以下操作来检查RAM:
int freeRam () {
  extern int __heap_start, *__brkval; 
  int v; 
  return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval); 
}

此外,如何“释放”这样的内存?

你使用的是哪个Arduino?你看到了吗:Arduino Playground - Available Memory:为了确定当前可用内存量,最准确的结果可以通过使用这个MemoryFree库来找到。 - Twisty
我也使用过那个库,但通常会得到不同的结果。也许下面的答案可以解释为什么我得到了不同的结果... - WildBill
是的,@GregHewgill的评论更好地解决了这个问题。 - Twisty
我猜应该没有进行垃圾清理。默认情况下,C++没有垃圾回收机制。我不知道你所使用的环境是什么,但是... - dmckee --- ex-moderator kitten
1个回答

7

当你仅仅调用free()释放单个内存块时,不能期望__brkval会减少。该内存块将被标记为空闲状态并可供重复使用,但通常情况下,__brkval只会根据程序在任何时刻所使用的最大内存量而向一个方向移动。


一个人如何实际地“释放它”?我想我应该编辑我的问题,因为那是一个“不好”的隐含后续问题。 :) - WildBill
@WildBill: 不要这样做。操作系统比你更知道如何最好地管理其内存。(可以说如此。) - Lightness Races in Orbit
1
@WildBill:由于Arduino不支持多任务处理,因此没有太多理由真正释放内存(即通过减少__brkval)。此外,内存管理器能够减少__brkval的唯一方法是如果您释放堆空间中的最后一个块。否则,在一般情况下,如果您释放中间的块,则不会进行内存压缩。 - Greg Hewgill

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接