我读到了这个: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;
}
答案 0 :(得分:5)
在大多数理智的操作系统上,你不必在退出时进行清理 - 这只是一个好习惯。
代码只是分配和释放内存的简单示例,在实际程序中,您将跟踪在程序运行时需要释放的内存,否则您将耗尽内存(或更可能的地址空间)
答案 1 :(得分:3)
您必须解除分配(通过free()
),因为您已经分配了它(通过malloc()
)。在大多数C API中,通常您负责在分配指针时释放指针。在某些情况下,这不是真的,但函数的手册页通常会指定。
答案 2 :(得分:3)
分配和释放内存的影响。一旦为某种目的分配内存,它会保持分配状态,直到您释放它为止。在分配时,它不可用于其他目的。解除分配的原因是使该内存可用于其他用途。
为什么这很重要。如果您的程序随着时间的推移继续分配新的内存块,这就变得非常重要。如果在不再需要内存时不释放内存,程序对内存的使用会增长,增长和增长,最终可能耗尽操作系统可用的内存池。
在这个例子中没有真正的伤害。在特定的例子中,跳过释放(可能)没有坏处。首先,程序此后立即结束,因此程序没有进一步使用该内存。另外,正如其他人所提到的,在C的典型实现中,你的程序在退出时会回放它的所有内存。
但是如果你的程序可能需要内存用于其他东西,或者你的程序在退出时不会将内存返回给操作系统,那么当你不再需要它时释放内存是个好主意。
释放内存,而不是指针。严格地说,该示例不会释放指针。它释放指针指向的内存。指针仍在那里,实际上仍指向现已释放的内存。如果您无意中继续使用指针,就好像它仍指向它所拥有的内存,这可能会导致无尽的调试快乐。
答案 3 :(得分:2)
无法保证分配的内存只会因为进程终止而返回系统资源。
答案 4 :(得分:1)
在main()函数中,一旦程序退出,即使您没有明确地释放它,所有分配的内存也会返回给操作系统。因此,手动操作通常被称为良好实践,这种“良好实践”具有实际意义。如果您将此代码放在另一个函数中,或者甚至在main中并且在循环中,您的程序将根据代码分配和释放内存。如果你有一个循环中的代码并且没有解除分配,这最终会占用你所有的内存,导致你的程序崩溃,除非处理。在某些情况下,这称为内存泄漏。所以,要好好了解好的做法! Memory Leak
答案 5 :(得分:1)
否则C内存分配器不知道您已完成使用它。