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

是否需要释放传入execve()的malloc分配数组的内存?

简易Shell中malloc分配的数组是否需要释放?

问题背景

我写了一个简易Shell程序,核心功能如下:

  • 显示提示符
  • 使用readline()接收用户输入
  • 按空格将输入字符串拆分为单词
  • 将单词存入malloc分配的数组
  • 调用fork()创建子进程
  • 子进程通过execve()传入该数组调用目标程序:execve(myarray[0], myarray, env);
  • 父进程等待子进程执行完成

我的疑问是:是否需要释放myarray这块malloc分配的内存?

以下是相关代码片段:

child_pid = fork();
42                 if (child_pid == -1)
43                 {
44                         perror(argv[0]);
45                         free(linebuffer);
46                         return (2);
47                 }
48
49                 if (child_pid == 0)
50                 {
51                         /*strsplit() returns MALLOC'd array*/
52                         splitted_str = _strsplit(linebuffer, ' ');
53
54                         if (execve(splitted_str[0], splitted_str, env) == -1)
55                         {
56                                 perror(argv[0]);
57                                 
             /*Function that frees a NULL terminated array*/  
free_array(splitted_str);
58                                 free(linebuffer);
59
60                                 return (2);
61                         }
62                 }
63                 else
64                 {
65                         wait(NULL);
66                 }

回答

分两种情况判断:

  1. execve执行成功时:
    一旦execve调用成功,子进程的整个地址空间会被目标程序完全覆盖,原来Shell代码里用malloc分配的splitted_str数组会被直接抛弃——因为此时子进程已经变成了新程序,原有的内存空间不再属于当前运行的代码,完全不需要手动释放。

  2. execve执行失败时:
    如果execve返回-1(比如找不到目标程序、权限不足等),子进程仍然在原Shell的地址空间中运行,这时候必须手动释放splitted_str(就像你代码里用free_array做的那样),否则会造成内存泄漏。

另外补充:父进程中并没有分配splitted_str,所以父进程完全不需要处理这块内存的释放,只有子进程在execve失败时需要做清理。

内容的提问来源于stack exchange,提问作者Nwaburu Emeka Christian

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 19:15:33