嗯,我想我知道这个问题的答案,但我更确信。如果您在堆上使用malloc内存并在释放空间之前退出程序,那么os或编译器是否为您释放空间?
答案 0 :(得分:3)
当操作系统从其进程列表中删除进程的描述符(在Linux的情况下为task_struct
)时,操作系统会为您释放空间。
编译器通常会生成一个exit()
系统调用,并在那里处理所有这些。
在Linux上,基本上所有这些都发生在内核的exit_mm()
函数中,最终由exit()
调用。它将使用mm_release()
函数释放进程拥有的地址空间。所有这些来源都可供您阅读(虽然它可能会有点复杂:)但是,操作系统负责释放进程的资源。
仅仅因为我非常喜欢它,如果您已经进入这些主题,这是一个非常好的阅读:Understanding the Linux Kernel。
答案 1 :(得分:3)
这超出了C标准的范围。发生什么取决于系统。在所有常见的主流操作系统中,操作系统将在完成该过程时释放内存。
尽管如此,总是清理自己的烂摊子是一种好习惯。因此,无论操作系统做什么,您都应该释放所有正在使用的资源。这样做也是发现隐藏的运行时错误的一种很好的方法:如果你有错误,当你试图释放资源时程序可能会崩溃,从而警告程序员这些错误。
对于编译器,它仅在程序创建期间处于活动状态,它与程序的运行时执行完全无关。
答案 2 :(得分:1)
操作系统将清除程序消耗的所有资源,包括所有已分配的内存,网络连接,文件句柄等。