4

可能重复:
当您退出 C 应用程序时,malloc-ed 内存是否会自动释放?

在 C 中,是否有必要在退出时释放指针? 当程序存在时,它是否从仍然指向已分配块的指针中释放内存?

它依赖于操作系统吗?

4

5 回答 5

10

据我所知,在大多数情况下,操作系统将在进程终止时释放任何进程内存,至少在最常见的用户操作系统(Windows、Linux 等)下是这样。如果进程崩溃等,操作系统也会执行清理。

然而,依靠操作系统来执行清理并不是正确的编码过程,你不能总是保证它会做你想做的事。如果您希望它在正确的时间正确完成,您应该始终执行自己的垃圾收集(我有程序在退出期间崩溃,因为系统以奇怪的顺序清理内存并创建了一些无效的指针,然后它试图释放)。

进程内存清理可能仅适用于原始进程或线程分配的内存。如果您产生新进程,这些进程可能会继续执行。如果您使用已经在运行的服务并调用一些分配内存的方法,然后让您控制,则可能无法清理。

一些视频驱动程序不会立即释放 VRAM,在一些较旧的卡上,运行反复泄漏 VRAM 的进程最终会导致系统崩溃。

您应该始终释放您分配的任何内存,尤其是当您的进程可能重新启动或继续执行时。

于 2010-06-27T02:05:20.173 回答
6

当程序退出时,操作系统将释放程序分配的任何内容。但是,最好总是释放您分配的内容。

于 2010-06-27T02:04:01.080 回答
6

这不是绝对必要的,实际上有时可以方便地“泄漏”这些指针以避免担心析构函数的顺序。

没有现代操作系统会泄漏此内存,进程使用的所有内存都将被回收。

于 2010-06-27T02:05:56.587 回答
2

这取决于操作系统,但实际上任何现代操作系统都应该在您终止时收回您的所有资源。

也就是说,如果可以的话,释放你获得的任何内存确实是一个好主意——除了少数情况外,你可以。另外,请记住我们在这里谈论的是内存,而不是一般的资源。您可能希望在适当的清理中做其他事情;操作系统无法猜测也无法为您做的事情。例如,断开某些外部服务,或删除某些临时文件。

于 2010-06-27T02:06:24.670 回答
-2

这取决于操作系统。尽管在大多数情况下,忘记释放指针不会造成太大的伤害,但这样做也不是一个好主意。这会导致内存泄漏。如果发生的时间足够长,您可能会遇到无法访问的奇怪内存不足,从而导致其他程序没有足够的内存来运行。

如果您正在谈论显式释放指针指向的动态分配的数组,简而言之,是的,您必须经历该过程。当程序退出时,如果您的程序没有释放该内存块,则指针仍指向分配的块,但不再允许您访问它,因为程序在退出时超出范围。

于 2010-06-27T02:04:42.723 回答