2

我读到这个: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;
}
4

6 回答 6

5

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

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

于 2011-06-01T17:38:25.343 回答
3

分配和释放内存的效果。一旦你为某种目的分配内存,它就会一直分配,直到你释放它。虽然已分配,但不可用于其他目的。释放它的原因是使该内存可用于其他用途。

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

在这个例子中没有真正的伤害。在您的特定示例中,跳过解除分配(可能)没有害处。一方面,程序随后立即结束,因此程序没有进一步使用该内存。另一方面,正如其他人所提到的,在 C 的典型实现中,您的程序在退出时会归还其所有内存。

但是,如果您的程序可能需要内存来做其他事情,或者如果您的程序在退出时不会将内存还给操作系统,那么在您不再需要内存时释放内存是个好主意。

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

于 2011-06-01T18:48:47.107 回答
3

您必须释放它(通过free()),因为您分配了它(通过malloc())。在大多数 C API 中,如果分配指针,通常您负责释放它。在某些情况下这是不正确的,但函数的手册页通常会指定这一点。

于 2011-06-01T17:34:56.397 回答
2

不能保证分配的内存会因为进程终止而回到系统的资源中。

于 2011-06-01T17:34:31.520 回答
1

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

于 2011-06-01T18:19:07.467 回答
1

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

于 2011-06-01T17:44:06.147 回答