2

我有这个疑问,你假设有一个包含十亿个元素的数组,你创建的数组如下:

int array[1000] = {1,2, ..., n.}

然后你完成程序。

不像java机器的java垃圾收集内存清理记录关于存储的这种安排。 它们留在内存中还是被释放?

4

6 回答 6

4

当进程退出时,操作系统会释放进程正在使用的所有内存。

(这不适用于某些小型嵌入式操作系统。)

于 2013-03-25T04:24:15.997 回答
1

程序的内存由操作系统管理,因此在程序退出时它会在任何情况下被释放。

在任何情况下,正如它所写的那样,您的分配可能是

  • 静态且在任何函数之外(因此它不会像在 Java 中那样在堆上进行管理),它既没有真正分配也没有释放
  • 在堆栈上自动(这确实是动态的,但无论如何它不是在 Java 中完成的)并且它在退出其范围时被释放

真正的比较是这样的

int *array = malloc(sizeof(int)*1000);

这将驻留在内存中,直到 afree(array)被调用或程序退出。

于 2013-03-25T04:24:29.470 回答
1

如果你这样做

if (true) {
  int array[1000] = {1,2,3};
  //...
}

// array[1000] "freed" here.

然后,当您退出“if”大括号时,内存将被释放。这是因为内存驻留在堆栈上,“分配”只是堆栈指针的移动。当范围退出时,堆栈指针返回到进入范围之前的位置。所以在这种情况下,分配和释放几乎是免费的(性能方面),假设你的堆栈足够大,可以容纳额外的 1000 个整数。在某些嵌入式系统上,它不会,并且您的应用程序会崩溃。

同样适用

int foo( int x )
{
  int array[1000] = {1,2,3};
  // ...
  return array[0];
}

// array[] "freed" here.

编辑:在最后一种情况下,如果将 foo() 替换为 main,则程序退出时数组将被“释放”。

于 2013-03-25T05:33:09.643 回答
0

简单来说就是在程序结束时释放内存。

于 2013-03-25T04:30:40.260 回答
0
  1. 通常操作系统不允许您拥有int a[10000000000000000000].
  2. 他们的价值观留在记忆中。但是内存会被退回。
于 2013-03-25T04:24:30.380 回答
0

在 c 中,如果您定义像 a[1000] 这样的数组,那么它将在堆栈部分分配,并在程序存在时自动释放内存。但是如果你动态分配(通过使用 malloc),那么你必须使用 free(array) 来释放内存。阵列的最大大小取决于您的系统 RAM 大小。

于 2013-03-25T05:05:40.003 回答