在C中,是否需要在退出时释放指针?

时间:2010-06-27 01:59:50

标签: c memory pointers free

  

可能重复:
  When you exit a C application, is the malloc-ed memory automatically freed?

在C中,是否需要在退出时释放指针? 程序存在时,是否从指向已分配块的指针中释放内存?

是否依赖于操作系统?

5 个答案:

答案 0 :(得分:9)

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

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

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

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

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

答案 1 :(得分:6)

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

答案 2 :(得分:5)

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

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

答案 3 :(得分:2)

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

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

答案 4 :(得分:-2)

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

如果你在谈论explicitly freeing a dynamically allocated array that a pointer is pointing to,简而言之,是的,你必须经历这个过程。当程序退出时,如果你的程序没有释放那个内存块,那么指针仍指向分配的块,但不再允许你访问它,因为退出时程序超出了范围。