5

假设一个程序有内存泄漏。

1)当一个进程死亡(通常或分段错误)时,那些泄漏的内存是否被释放?

2)进程拥有的其他资源呢?

4

4 回答 4

7

对于大多数现代操作系统(Linux、NT 3.5 左右的 Windows),是的。

于 2012-08-18T02:43:46.120 回答
2

1)是的,内存已释放。

2) 不同的流程模型?我不知道你的意思是什么,但是一旦一个程序死掉,它malloc'd或new'd的所有内存都会返回给操作系统,稍后将重新分配给另一个程序。

3)一旦程序退出,所有分配的内存都会返回给操作系统,但是直到该进程被wait()另一个进程ed,还有少量数据,例如退出状态等待有人收集。我相信在 linux 上,来自 bash/init 的正常进程将被等待并自动清理。

于 2012-08-18T04:04:42.053 回答
2

我认为,在所有现代系统上,堆栈和堆内存被释放,文件描述符被关闭。

在 POSIX 系统上,有许多资源在进程退出时未被释放、共享信号量、消息队列和内存段。这些意味着在进程之间是持久的,所以它们根本不能。释放它们是应用程序的责任。

它可以使用处理程序来做到这一点on_exit,但通常有一种更简单的方法。对于内存段,您通常会shm_unlink在所有进程都打开这样的段之后使用。当最后一个进程(及其对该段的文件描述符)关闭时,该段将不复存在。

于 2012-08-18T06:40:38.377 回答
1

您可以放心地假设现代 linux 系统将释放内存......但是......它不是保证,当然也不是最佳实践。

于 2012-08-18T03:00:27.423 回答