假设一个程序有内存泄漏。
1)当一个进程死亡(通常或分段错误)时,那些泄漏的内存是否被释放?
2)进程拥有的其他资源呢?
对于大多数现代操作系统(Linux、NT 3.5 左右的 Windows),是的。
1)是的,内存已释放。
2) 不同的流程模型?我不知道你的意思是什么,但是一旦一个程序死掉,它malloc
'd或new
'd的所有内存都会返回给操作系统,稍后将重新分配给另一个程序。
3)一旦程序退出,所有分配的内存都会返回给操作系统,但是直到该进程被wait()
另一个进程ed,还有少量数据,例如退出状态等待有人收集。我相信在 linux 上,来自 bash/init 的正常进程将被等待并自动清理。
我认为,在所有现代系统上,堆栈和堆内存被释放,文件描述符被关闭。
在 POSIX 系统上,有许多资源在进程退出时未被释放、共享信号量、消息队列和内存段。这些意味着在进程之间是持久的,所以它们根本不能。释放它们是应用程序的责任。
它可以使用处理程序来做到这一点on_exit
,但通常有一种更简单的方法。对于内存段,您通常会shm_unlink
在所有进程都打开这样的段之后使用。当最后一个进程(及其对该段的文件描述符)关闭时,该段将不复存在。
您可以放心地假设现代 linux 系统将释放内存......但是......它不是保证,当然也不是最佳实践。