- 父进程使用malloc()函数分配内存。
- fork操作。
- 父进程修改已分配的内存块。
- 写时复制(CoW)机制启动,创建一个修改后的内存块的副本,并保留原始内存块的副本。
- 子进程不知道也不关心父进程的内存块,并且不会在其拥有的副本上调用free()函数。
- 内存泄漏!
我是正确的吗?还是错了?如果是后者,实际上会发生什么?
malloc()
和fork()
都不会造成内存泄漏——所以我认为你是错误的。fork()
或malloc()
的错。fork()
之后运行相同的代码,进程之间的主要区别是PID和fork()
的返回值。其他几乎所有内容(详见POSIX规范中关于fork()
的说明)都是相同的。因此,如果代码泄漏,那么这是程序员引入的错误,不是malloc()
或fork()
的错误。exec*()
系列函数之一,则原始进程中的所有分配内存都将被释放。新进程会分配新的内存。同样,如果子进程退出,那么内存将被释放。操作系统不会长期失去对内存的跟踪。free()
返回的释放内存通常会留给另一个对 malloc()
的调用以供重用,而不是返回给操作系统。 - Jonathan Leffler
free()
是必要的。虽然程序结束时的清理也会做到这一点。 - ott--