为什么我必须在使用它后解除分配指针? (ANSI-C)

时间:2011-06-01 17:31:33

标签: c pointers ansi

我读到了这个:http://www.drpaulcarter.com/cs/common-c-errors.php#2.8 并且有一段代码:

#include <string.h>
#include <stdlib.h>
int main()
{
  char *st = malloc(20);   /* st points to allocated array*/

  strcpy(st, "abc");  /* st points to char array */
  free(st);                /* don't forget to deallocate when done! */
  return 0;
}

6 个答案:

答案 0 :(得分:5)

在大多数理智的操作系统上,你不必在退出时进行清理 - 这只是一个好习惯。

代码只是分配和释放内存的简单示例,在实际程序中,您将跟踪在程序运行时需要释放的内存,否则您将耗尽内存(或更可能的地址空间)

答案 1 :(得分:3)

您必须解除分配(通过free()),因为您已经分配了它(通过malloc())。在大多数C API中,通常您负责在分配指针时释放指针。在某些情况下,这不是真的,但函数的手册页通常会指定。

答案 2 :(得分:3)

分配和释放内存的影响。一旦为某种目的分配内存,它会保持分配状态,直到您释放它为止。在分配时,它不可用于其他目的。解除分配的原因是使该内存可用于其他用途。

为什么这很重要。如果您的程序随着时间的推移继续分配新的内存块,这就变得非常重要。如果在不再需要内存时不释放内存,程序对内存的使用会增长,增长和增长,最终可能耗尽操作系统可用的内存池。

在这个例子中没有真正的伤害。在特定的例子中,跳过释放(可能)没有坏处。首先,程序此后立即结束,因此程序没有进一步使用该内存。另外,正如其他人所提到的,在C的典型实现中,你的程序在退出时会回放它的所有内存。

但是如果你的程序可能需要内存用于其他东西,或者你的程序在退出时不会将内存返回给操作系统,那么当你不再需要它时释放内存是个好主意。

释放内存,而不是指针。严格地说,该示例不会释放指针。它释放指针指向的内存。指针仍在那里,实际上仍指向现已释放的内存。如果您无意中继续使用指针,就好像它仍指向它所拥有的内存,这可能会导致无尽的调试快乐。

答案 3 :(得分:2)

无法保证分配的内存只会因为进程终止而返回系统资源。

答案 4 :(得分:1)

在main()函数中,一旦程序退出,即使您没有明确地释放它,所有分配的内存也会返回给操作系统。因此,手动操作通常被称为良好实践,这种“良好实践”具有实际意义。如果您将此代码放在另一个函数中,或者甚至在main中并且在循环中,您的程序将根据代码分配和释放内存。如果你有一个循环中的代码并且没有解除分配,这最终会占用你所有的内存,导致你的程序崩溃,除非处理。在某些情况下,这称为内存泄漏。所以,要好好了解好的做法! Memory Leak

答案 5 :(得分:1)

否则C内存分配器不知道您已完成使用它。