You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言中杀死子进程后为何出现内存泄漏?

问题分析与解决

你的代码中子进程调用kill(getpid(), SIGKILL)会导致进程异常强制终止,虽然你在这之前调用了free(numbers),但SIGKILL是无法被进程捕获或处理的信号,会直接终止进程,valgrind因此无法正确追踪到内存已被释放的状态,进而误报内存泄漏。

另外,子进程完全不需要调用kill来终止自己,直接用exit(0)或return就能正常退出,这样内存释放操作会被系统和valgrind正确识别。

修正后的代码

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>

int main()
{
    int *numbers = (int *)malloc(sizeof(int) * 3);
    numbers[0] = 1;
    numbers[1] = 2;
    numbers[2] = 4;
    int child = fork();
    for (int i = 0; i < 3; i++)
    {
        printf("%d\n", numbers[i]);
    }

    if (child == 0)
    {
        free(numbers);
        exit(0); // 用正常退出替代SIGKILL
    }

    free(numbers);
    return 0;
}

关键说明

  • 子进程正常退出时,系统会自动清理进程所有资源,配合显式free和exit(0),valgrind能正确检测到内存已释放,不会再报泄漏。
  • SIGKILL仅用于强制终止无响应进程,子进程主动调用完全没必要,反而会引发异常终止相关的检测问题。

内容的提问来源于stack exchange,提问作者mate istvan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 18:52:03