#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)
或者这会在循环结束时自动发生?
确保释放在该代码段中分配的内存的策略是什么?
SCENARIO:“我想在两种方法中访问该对象,因此该对象在全局范围内声明,然后在安装时进行实例化。”
loop()终止后会发生什么? mainComponent还会留在内存中吗?
如果是OS NO,则进程将终止,然后资源将被释放。
所以在Arduino中如何通过确保在关闭控制器时释放内存来实现上面的SCENARIO?
答案 0 :(得分:4)
令人困惑的是,main()函数被基本的Arduino IDE隐藏了。您的程序具有main()函数,就像在任何其他平台上一样,并且具有与在具有OS的计算机上运行时相同的生命周期。如果你看一下arduino ___ \ hardware \ cores \ aduino,你会发现一个文件main.cpp,它包含在你的二进制文件中:
int main(void)
{
init();
//...
setup();
for (;;) {
loop();
if (serialEventRun) serialEventRun();
}
return 0;
}
考虑到这个文件你现在会看到,当你退出循环()时,它会被连续调用。您的计划从不退出。一般来说,你最好的模式是新对象一次,永远不会删除,就像你在这里做的那样。如果你是在微控制器上反复删除和删除对象,你就不会明智地考虑生命周期和资源。
所以 “是从loop()返回时删除的新对象?”不,程序仍在运行,并且它仍然在堆上。
“断电会发生什么?有办法清理吗?”电源电压下降过低时,微控制器将停止执行指令。电源管理器电路可以防止控制器做任何不稳定的事情,因为电压下降(应该防止)当电压完全耗尽时,所有RAM都会丢失。如果不添加电路,则无法在断电时执行任何清理。
“我需要清理吗?”不,在加电时,一切都会重置为已知状态。操作不受RAM中遗留的任何操作的影响(假设您初始化所有变量)。