malloc + fork 会造成内存泄漏吗?

Does malloc + fork create a memory leak?

  1. Parent 进程执行 malloc()
  2. 分叉
  3. parent修改分配块
  4. CoW 启动并创建修改块的一个副本,同时保留旧副本
  5. child 不知道也不关心 parent 的东西,也不会在它的副本上调用 free()
  6. 内存泄漏!

我说的对吗?我错了吗?如果是后者,实际会发生什么?

malloc()fork() 都没有造成泄漏 — 所以我想你错了。

parent 有自己的分配块副本。它可以随心所欲地处理它。 child 有自己的分配块副本。它也可以为所欲为。如果 child 忽略该块,则它不是泄漏(还)。如果 child 轻率地践踏一个指针,或者 returns 来自一个函数,该指针持有指向已分配内存的唯一指针而不先释放它,这将导致泄漏。但问题不在于 fork()malloc()

请记住,相同的代码是 fork() 之后的 运行 — 进程之间的主要区别在于 PID 和来自 fork() 的 return 值。其他所有内容(几乎所有其他内容 — 有关详细信息,请参阅 fork() 的 POSIX 规范)是相同的。因此,如果代码泄漏,那是程序员引入的错误——这不是 malloc()fork() 的错。

请注意,如果 child 使用 exec*() 函数族之一,则释放所有从原始进程分配的内存。新进程获得分配的新内存。同样,如果child退出,那么内存也会被释放。 O/S 不存在失去记忆的 long-term 风险。