操作系统只会恢复它(在程序退出后)对吗?那么除了良好的编程风格之外还有什么用?还是有什么我误解的?是什么使它与“自动”分配不同,因为两者都可以在运行时更改,并且都在程序执行后结束?
答案 0 :(得分:12)
当您的应用程序处理大量数据时,您必须释放以节省堆空间。如果你不这样做,可能会发生几件坏事:
操作系统收集应用程序退出时分配的所有空间这一事实并不意味着您应该依赖它来编写可靠的应用程序。这就像试图依靠编译器来优化糟糕的编程。内存管理对于良好的性能,可伸缩性和可靠性至关重要。
正如其他人所提到的,malloc
在堆中分配空间,而在堆栈上创建自动变量。两者都有用途,但确实非常不同。堆空间必须由操作系统分配和管理,并且可以动态存储不同大小的数据。
答案 1 :(得分:2)
在C / C ++中,“auto”变量在堆栈上分配。它们在功能出口处被摧毁。这将自动发生。你不需要为此写任何东西。
堆分配(调用malloc
的结果)要么显式释放(调用free
),要么在过程结束时清除它们。
如果您正在编写可能会使用一次或两次的小程序,那么可以不释放堆分配。这不好,但可以接受。
如果您正在编写中型或大型项目或计划将代码包含到其他项目中,那么您肯定应该释放每个堆分配。不这样做会造成巨大的麻烦。堆内存不是无穷无尽的。程序可以全部使用它。即使您将分配少量内存,这仍然会在操作系统上产生无限制的压力,导致交换等。
底线:释放分配不仅仅是一种风格或一种好习惯。
答案 2 :(得分:2)
这是一种很好的编程风格,而且不止于此。在非平凡的程序中不进行适当的内存管理最终会影响程序的可用性。当然,操作系统可以回收您在程序终止后分配/使用的所有资源,但这并不能减轻程序执行期间的负担或潜在问题。
考虑用于发布此问题的Web浏览器:如果浏览器是使用需要内存管理的语言编写的,并且代码没有正确执行,那么您认为它之前会有多长时间?注意到它正在吞噬你所有的记忆?您认为浏览器可以使用多长时间?现在考虑用户经常让浏览器长时间打开:如果没有适当的内存管理,在少量页面加载后它们将无法使用。
答案 3 :(得分:2)
如果你在没有使用free()的情况下调用一千次宏,那么编译器或安全说系统将为你分配一千个不同的地址,但是如果你在每个malloc之后使用free()那么只会给你一个内存地址每次。 因此,内存泄漏,总线错误,内存超出限制和崩溃的可能性最小。 它可以安全地使用free()。
答案 4 :(得分:2)
一旦退出定义它的作用域,就会销毁自动变量(并且其内存可重复使用)。对于大多数早于程序退出的变量。
如果您malloc
而不是free
,则在程序退出之前内存不可重复使用。在一些操作系统非常小的系统上,甚至还没有。
所以是的,自动变量和泄漏内存分配之间存在很大差异。调用一个漏掉分配足够次数的函数,你就会耗尽内存。
可以根据需要多次调用带有自动变量的函数。答案 5 :(得分:1)
如果你的程序没有立即退出并且你没有释放你的记忆,你最终会浪费它。你最终会耗尽内存,或者你将开始交换到磁盘(这很慢,也不是无限制)。
答案 6 :(得分:1)
自动变量在堆栈上,其大小应在编译时知道。如果您需要存储大小不合适的数据,例如,维护二叉树,用户可以在其中添加和删除对象。旁边的堆栈大小可能是有限的(取决于你的目标),例如,linux内核堆栈通常是4k-8k。您还会删除影响性能的指令缓存
答案 7 :(得分:0)
是的,你必须在malloc()之后使用free()(以及在完成后关闭文件和其他资源)。虽然操作系统在执行后会恢复它,但是长时间运行的进程会以这种方式泄漏内存。如果你的程序就像运行单一方法的主方法一样简单,那么它可能不是什么大问题,虽然非常草率。你应该养成在C中正确管理内存的习惯,因为有一天你可能想写一个运行时间超过一秒钟的非平凡程序,如果你没有事先知道怎么做,你就会有一个处理内存泄漏的巨大麻烦。