是否需要释放传入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 }
回答
分两种情况判断:
execve执行成功时:
一旦execve调用成功,子进程的整个地址空间会被目标程序完全覆盖,原来Shell代码里用malloc分配的splitted_str数组会被直接抛弃——因为此时子进程已经变成了新程序,原有的内存空间不再属于当前运行的代码,完全不需要手动释放。execve执行失败时:
如果execve返回-1(比如找不到目标程序、权限不足等),子进程仍然在原Shell的地址空间中运行,这时候必须手动释放splitted_str(就像你代码里用free_array做的那样),否则会造成内存泄漏。
另外补充:父进程中并没有分配splitted_str,所以父进程完全不需要处理这块内存的释放,只有子进程在execve失败时需要做清理。
内容的提问来源于stack exchange,提问作者Nwaburu Emeka Christian
相关产品推荐
相关产品推荐

