gpt4 book ai didi

c - 关于子进程发生内存泄漏的问题

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:14:58 25 4
gpt4 key购买 nike

假设函数func有bug导致内存泄漏。

pid_t childPid;
int status;
childPid = fork();
if (childPid == -1)
errExit("fork");
if (childPid == 0) /* Child calls func() and */
exit(func(arg)); /* uses return value as exit status */

/* Parent waits for child to terminate. It can determine the
result of func() by inspecting 'status'. */
if (wait(&status) == -1)
errExit("wait");

问题 1>如果一个程序泄漏了内存,最后程序退出后,它是否仍然泄漏内存,还是系统会收集该程序分配的所有内存,不再有泄漏的内存?

问题 2>父进程调用wait后,子进程的func导致的内存泄露是怎么回事?

最佳答案

If a program leaks memory, after the program exits in the end, does it still leak memory or system will collect all memory allocated by the program and there is no more leaked memory?

系统会收集子进程所有的内存资源,子进程不会再有内存泄漏。此外,对 fork() 的调用将父进程和子进程的内存空间分开,因此子进程中的泄漏不会泄漏到父进程中,除非您在两者中调用相同的错误函数。

After the parent process calls the wait, how is the leaked memory caused by the func in child process?

在parent中调用wait(),和child泄漏内存真的没有关系。在父进程中调用 wait() 只会导致父进程阻塞等待指示子进程已完成的信号。 child 仍然必须先调用 func() 才能完成,因为它必须将 func() 的返回值传递给 exit()。因此 func() 仍然可以在技术上“泄漏”内存,因为它在堆上分配了一些内存,但不清理它,即使操作系统的清理操作几乎立即发生在 func() 被调用之后。换句话说,在 exit() 调用完成后,操作系统释放了子进程使用的资源,但 func() 本身仍然无法释放任何内存它试图分配。

关于c - 关于子进程发生内存泄漏的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6737808/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com