C++ 函数中的变量是否在Arduinos上始终存在于RAM中?

C++ 函数中的变量是否在Arduinos上始终存在于RAM中?,c++,memory,memory-management,arduino,C++,Memory,Memory Management,Arduino,我有一个相当大的Arduino草图,它正在突破处理器上可用内存的极限。我正在释放内存,尽可能减少全局变量的使用。我正在使用MemoryFree.h(可以找到详细信息)检查可用内存。我有一个工作草图(太长了,不能贴在这里),但是当我添加了一个有几个变量(在我认为可用内存内)的函数时,我的系统因为没有内存而崩溃或停止。 我添加了以下功能: boolean moved(){ int yreadings[4]; int zreadings[4]; free(&yreadings); fre

我有一个相当大的Arduino草图,它正在突破处理器上可用内存的极限。我正在释放内存,尽可能减少全局变量的使用。我正在使用
MemoryFree.h
(可以找到详细信息)检查可用内存。我有一个工作草图(太长了,不能贴在这里),但是当我添加了一个有几个变量(在我认为可用内存内)的函数时,我的系统因为没有内存而崩溃或停止。 我添加了以下功能:

boolean moved(){

int yreadings[4];
int zreadings[4];


free(&yreadings);
free(&zreadings);
}
然后,我将以下代码添加到我的主循环中:

 Serial.print("Mem is ");
 Serial.println(freeMemory());
 moved();
如果循环中的
moved()
,并且下面的整个函数都被注释掉了,我会得到

Mem is 499
在每次迭代中,建议每次迭代不会丢失内存

但是,如果我取消对函数的注释并将其调用,则会得到以下输出:

Mem is 499
Mem is -16094
在撞车前的第一行和第二行

即使内存是持久性的,这难道不应该比每次迭代使用的整个499字节少得多吗?不过,我怎么会失去记忆呢

更新:
更奇怪的是:如果我删除moved()函数并全局声明整数数组,我仍然会得到499的内存读取。怎么会这样?它不应该减少24个整数所消耗的内存量吗?

如果您只需要自动存储函数执行的一部分,您可以将它们放在作用域块中:

void foo(void) {

   // some code where neither reading variable is occupying memory

   {
      int yreadings[4];
      int zreadings[4];

      // here these variable are taking up memory

   }

   // other code where neither reading variable is occupying memory
}
当然,你只能在那个街区使用它们


为了扩展我的评论,有三类内存使用具有不同的持续时间

  • 函数、方法或类上下文中声明的全局变量和变量在程序的整个生命周期中都存在
  • 自动变量(在函数或方法中声明的变量)在其作用域的生命周期内存在,包括从该作用域调用的任何其他子程序的生命周期
  • 动态分配是从
    new
    1或
    alloc
    函数系列中获得的内存块(由于簿记原因,其大小始终略大于您请求的大小),从分配它们时起一直持续到您分别调用
    delete
    free


1如果您覆盖
new
,这可能仍然适用,也可能不适用,但如果您这样做,您需要了解您对自己做了什么。

您不应该
在自动存储中释放
内存。删除
免费(&yreadings);免费阅读(&Y)你现在得到了什么?删除它会让事情运行得更顺畅。至少有一段时间。不过,它在几次迭代之后就崩溃了。。。。删除此功能允许它运行一段时间而没有问题。。。我通过移除For()调用来获得499个持久值。@ WordBar坦白地说,听起来好像你不理解C++中内存的工作方式。也许你应该找一个基本的介绍。您需要了解三类:全局和函数静态数据(通常称为“数据段中”);自动(通常被称为“在堆栈上”,尽管标准没有使用该短语);以及空闲存储中的动态分配(通常被称为“堆上”)。我想我是这样做的,但我不明白的是,为什么尽管这些数组的声明位置不同,主循环中的内存计数却相同?如果它们是全局声明的或在函数中声明的,那么为什么在函数调用之外内存计数是相同的?我是否应该在声明每个全局变量时丢失内存?我已经考虑过了,但还没有这样做,主要是因为我在问题中添加了最后一点。我想我的自由内存发现遗漏了一些东西。我知道在程序的生命周期中存在全局变量,因此,如果我全局声明变量或使用自动变量,为什么在主循环中空闲内存是相同的,我会感到困惑……这里要理解的另一件事就是
freemory
返回了什么。它知道堆栈指针吗?它是否知道实际使用了多少空闲存储,最大空闲块的大小,或者只是最高分配的地址?