0

我知道如果我新建一些数组,我必须删除它:

    int *i=new i[10];

    delete[] i;

静态数组怎么样:

    int i[100];

或者

    int i[]={1,2,3,4};

应该删除吗?

假设代码如下:

    bool fu()
    {
      for(int i=0;i<100;i++
      {
       int j[]={1,2,3,4};
      }
      return 0;
    }

j[] 是从 RAM 中消失(在返回 0 之后)还是保留在那里并在多次迭代后使 RAM 充满?

因为我想在 micro 上编程有点担心。谢谢

4

5 回答 5

3

你不需要删除那些。它们位于内存中的堆栈上,而不是堆上,并且一旦您离开它们的范围就会被清除。

在您的示例中: j 在您离开循环时被清除。

于 2013-02-07T08:33:43.163 回答
3

静态数组怎么样:

int i[100];
int i[]={1,2,3,4};

应该删除吗?

不...static当程序终止或范围退出时,数据(当此类定义出现在任何函数范围之外时使用)和基于堆栈的数据(用于函数内的变量)都会自动销毁(如果需要)。变量的内存static不需要由程序显式“释放” - 操作系统将在程序终止时回收内存。堆栈内存有点像海滩上的波浪......当进入和退出范围时,使用(覆盖)相同的内存(想想海滩上的区域)然后自动释放,然后重用......

bool fu()
{
  for(int i=0;i<100;i++
  {
   int j[]={1,2,3,4};
  }
  return 0;
}

在这里,j[]在堆栈上重新创建 - 尽管 C++ 标准没有讨论此类实现细节,但每次循环可能在相同的地址 - 但它可以通过从 {1, 2 的常量(静态)数组中重新复制数据来重新初始化, 3, 4} 是为此目的而存储的。(如果优化器推断您从未更改它,它可能会跳过重新初始化,甚至删除堆栈变量并直接访问常量数组值,甚至删除常量数组并将访问的特定值移动到机器代码操作码中的立即值 -优化器几乎可以做任何事情,只要它不影响程序性能以外的任何事情)。

于 2013-02-07T08:37:22.537 回答
2

不,通常不得删除堆栈上的变量。

于 2013-02-07T08:33:43.473 回答
1

看看http://www.learncpp.com/cpp-tutorial/79-the-stack-and-the-heap/你会在哪里找到你的问题的解释

于 2013-02-07T08:40:38.570 回答
1

如果您这样声明一个“静态”数组,

静态int i[100];

为 100 个整数分配的内存会在程序的整个生命周期中保留。但为此,

诠释我[100]

当超出范围时,内存正在释放并超出堆栈(因为这是本地的)。

于 2013-02-07T08:41:48.790 回答