Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么我必须在使用指针后释放它???(ANSI-C)_C_Pointers_Ansi - Fatal编程技术网

为什么我必须在使用指针后释放它???(ANSI-C)

为什么我必须在使用指针后释放它???(ANSI-C),c,pointers,ansi,C,Pointers,Ansi,我读到: 有一段代码是这样的: #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 deallocat

我读到: 有一段代码是这样的:

#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;
}
#包括
#包括
int main()
{
char*st=malloc(20);/*st点到分配的数组*/
strcpy(st,“abc”);/*st指向字符数组*/
免费(st);/*完成后不要忘记取消分配*/
返回0;
}

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

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

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

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

,所有分配的内存都会返回到操作系统,即使您没有显式取消分配它。因此,手工操作通常被称为良好实践,这种“良好实践”具有实际意义。如果您将此代码放在另一个函数中,或者甚至放在main和with中,那么您的程序将按照代码分配和释放内存。如果代码在一个循环中,并且没有释放,这最终会消耗所有内存,导致程序崩溃,除非得到处理。在某些情况下,这称为内存泄漏。因此,要充分了解好的做法!

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

分配和取消分配内存的效果。一旦您出于某种目的分配内存,它将一直保持分配状态,直到您取消分配它为止。虽然已分配,但无法用于其他目的。取消分配它的原因是为了使该内存可用于其他用途

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

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

但是,如果您的程序可能需要用于其他用途的内存,或者如果您的程序在退出时不会将内存返回给操作系统,那么最好在不再需要内存时释放内存


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

当您不再需要应用程序并且将来不再需要它们时,您是否保持应用程序打开?;)如果您分配内存,那么您必须取消分配它。否则它将永远不会被释放。在询问有关内存分配的问题之前,您需要做更多的研究。这确实属于StackOverflow.com。您应该注意,您没有取消分配指针(在您的示例中,指针是
main
函数的一个自动局部变量)。您正在取消分配它指向的对象,该对象是通过
malloc
获得的。如果您的代码将用于持续运行的服务中,您必须始终小心清理。否则,内存就会耗尽。如果您只关心“退出时”清理,那么您可能不需要担心。需要注意的两个要点:一个是,对于将被多次调用的非常短暂的进程,如果操作系统无论如何都要为您清理内存,那么在退出前不清理内存实际上可能更有效。此外,即使操作系统在程序退出时确实为您清理了内存,如果您使用valgrind之类的工具,不显式释放内存可能会导致大量噪音。我发现最好的做法是总是免费提供一切,然后如果你能证明它确实会为你带来必要的性能,那么就取消交易。在那种特殊情况下,仅仅因为你侥幸逃脱就做坏事永远都不好。你养成了坏习惯,这会给将来的维护人员(那些知道你住在哪里的精神病患者)带来问题,而且正如前面所说的,你不能用工具告诉你什么时候你真的搞砸了。@mattnz好吧,清理一些操作系统可以清理的东西要比你做的坏事快得多。并不是说你“侥幸逃脱”;这是操作系统向您提供的保证。为什么不利用它呢@mattnz well duh,然后您进行清理:)如果您的进程即将终止,那么您进行清理是在浪费时间。当然,在所有其他情况下,这都是必要的。如果有人在系统服务中重用我的进程,那么它的行为不会改变:它仍然会在其终止点之前清除所有内存。只有在进程退出时操作系统释放内存时,才会出现这种情况。为了进行历史对比,请考虑Mac OS 9和X以及以前的16位Windows及其LoopalLoad()API。@ Heath:我不记得了。