1
#include <Arduino.h>
#include "include/MainComponent.h"

/*
  Turns on an LED on for one second, then off for one second, repeatedly.
*/


MainComponent* mainComponent;

void setup()
{

    mainComponent = new MainComponent();
    mainComponent->beginComponent();

}

void loop()
{

    mainComponent->runComponent();
}

是否有任何回调来释放 Arduino 中的内存?(例如调用 delete mainComponent)

或者这会在循环结束时自动发生?

确保释放该代码片段中分配的内存的策略是什么?

场景:“我想在两种方法中访问该对象,因此该对象在全局范围内声明,然后在设置时实例化。”

当 loop() 终止时会发生什么?mainComponent 还会保留在内存中吗?

如果它在 OS NO 中,进程将终止,然后资源将被释放。

那么在 Arduino 中,如何通过确保在控制器关闭时释放内存来实现上述场景?

4

1 回答 1

4

让您感到困惑的是 main() 函数被基本的 Arduino IDE 隐藏了。您的程序与在任何其他平台上一样具有 main() 函数,并且具有与在具有操作系统的计算机上运行时相同的生命周期。如果你在 arduino___\hardware\cores\aduino 下查看,你会发现一个 main.cpp 文件,它包含在你的二进制文件中:

int main(void)
{
   init();

   //...       
   setup();

   for (;;) {
      loop();
      if (serialEventRun) serialEventRun();
   }

   return 0;
}

考虑到这个文件,您现在将看到,当您退出 loop() 时,它会被连续调用。你的程序永远不会退出。一般来说,你最好的模式是新对象一次并且永远不会删除,就像你在这里所做的那样。如果您在微控制器上反复新建和删除对象,那么您就没有明智地考虑生命周期和资源。

那么“从循环()返回时是否删除了新的对象?” 不,该程序仍在运行并且它停留在堆上。

“断电怎么办?有什么办法清理吗?” 一旦电源电压降得太低,微控制器就会停止执行指令。电源监控电路可防止控制器在电压下降时做任何不稳定的事情(应该防止)当电压完全耗尽时,所有 RAM 都会丢失。如果不添加电路,您将无法在断电时执行任何清理。

“我需要打扫吗?” 不,在通电时,一切都会重置为已知状态。操作不会受到 RAM 中遗留的任何东西的影响(假设您初始化了所有变量)。

于 2013-07-16T06:03:50.530 回答