malloc + fork 会造成内存泄漏吗?
Does malloc + fork create a memory leak?
- Parent 进程执行 malloc()
- 分叉
- parent修改分配块
- CoW 启动并创建修改块的一个副本,同时保留旧副本
- child 不知道也不关心 parent 的东西,也不会在它的副本上调用 free()
- 内存泄漏!
我说的对吗?我错了吗?如果是后者,实际会发生什么?
malloc()
和 fork()
都没有造成泄漏 — 所以我想你错了。
parent 有自己的分配块副本。它可以随心所欲地处理它。 child 有自己的分配块副本。它也可以为所欲为。如果 child 忽略该块,则它不是泄漏(还)。如果 child 轻率地践踏一个指针,或者 returns 来自一个函数,该指针持有指向已分配内存的唯一指针而不先释放它,这将导致泄漏。但问题不在于 fork()
或 malloc()
。
请记住,相同的代码是 fork()
之后的 运行 — 进程之间的主要区别在于 PID 和来自 fork()
的 return 值。其他所有内容(几乎所有其他内容 — 有关详细信息,请参阅 fork()
的 POSIX 规范)是相同的。因此,如果代码泄漏,那是程序员引入的错误——这不是 malloc()
或 fork()
的错。
请注意,如果 child 使用 exec*()
函数族之一,则释放所有从原始进程分配的内存。新进程获得分配的新内存。同样,如果child退出,那么内存也会被释放。 O/S 不存在失去记忆的 long-term 风险。
- Parent 进程执行 malloc()
- 分叉
- parent修改分配块
- CoW 启动并创建修改块的一个副本,同时保留旧副本
- child 不知道也不关心 parent 的东西,也不会在它的副本上调用 free()
- 内存泄漏!
我说的对吗?我错了吗?如果是后者,实际会发生什么?
malloc()
和 fork()
都没有造成泄漏 — 所以我想你错了。
parent 有自己的分配块副本。它可以随心所欲地处理它。 child 有自己的分配块副本。它也可以为所欲为。如果 child 忽略该块,则它不是泄漏(还)。如果 child 轻率地践踏一个指针,或者 returns 来自一个函数,该指针持有指向已分配内存的唯一指针而不先释放它,这将导致泄漏。但问题不在于 fork()
或 malloc()
。
请记住,相同的代码是 fork()
之后的 运行 — 进程之间的主要区别在于 PID 和来自 fork()
的 return 值。其他所有内容(几乎所有其他内容 — 有关详细信息,请参阅 fork()
的 POSIX 规范)是相同的。因此,如果代码泄漏,那是程序员引入的错误——这不是 malloc()
或 fork()
的错。
请注意,如果 child 使用 exec*()
函数族之一,则释放所有从原始进程分配的内存。新进程获得分配的新内存。同样,如果child退出,那么内存也会被释放。 O/S 不存在失去记忆的 long-term 风险。