对 8 位 AVR 微控制器进行编程时,我遇到了如下代码所示的行为:
class classA
{
public:
classA(Display *d) : _d(d) { _d->println("classA()", 0); }
~classA() { _d->println("~classA()", 1); }
uint8_t array[200];
Display *_d;
};
void useClassA(classA *a)
{
a->array[3] = 5;
}
void SomeClass::start()
{
SYSTEM_DISPLAY_FREE_RAM();
debugMethod();
_ui->lcd().println("after debugMethod", 3);
SYSTEM_WAIT_DEBUG_BUTTON();
SYSTEM_DISPLAY_FREE_RAM();
}
void SomeClass::debugMethod()
{
_ui->lcd().println("entered debugMethod", 3);
SYSTEM_WAIT_DEBUG_BUTTON();
SYSTEM_DISPLAY_FREE_RAM();
_ui->lcd().println("before while", 3);
SYSTEM_WAIT_DEBUG_BUTTON();
volatile uint8_t i = 1;
while (i != 0)
{
classA cA(&_ui->lcd());
SYSTEM_DISPLAY_FREE_RAM();
cA.array[199] = i--;
useClassA(&cA);
}
_ui->lcd().println("after while", 3);
SYSTEM_WAIT_DEBUG_BUTTON();
SYSTEM_DISPLAY_FREE_RAM();
}
SYSTEM_DISPLAY_FREE_RAM() 计算可用 RAM,如 http://jeelabs.org/2011/05/22/atmega-memory-use/中所述。当执行到达 SomeClass::start() 我得到以下输出:
Free Ram: 2677
entered debugMethod
Free Ram: 2458
before while
classA()
Free Ram: 2458
~classA()
after while
Free Ram: 2458
after debugMethod
Free Ram: 2677
尽管classA
在 内部创建和销毁了对象while
,但内存似乎是在 的乞求时分配的debugMethod()
,并且一直保留到方法结束。我希望仅在一段时间内分配内存,因此使用Free Ram: 2458
.
对发生的事情有任何解释吗?
有没有办法在while
不使用new
关键字的情况下强制在 内部进行分配?
使用的编译器:avr-gcc (WinAVR 20100110) 4.3.3