Nic*_*ick 4 c malloc memory-leaks fork execv
考虑这个毫无意义的计划:
/* main.c */
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char **argv) {
int i;
for (i = 0; i < 1024; i++) {
int pid = fork();
int status;
if (pid) {
wait(&status);
}
else {
char *ptr = (char *)malloc(1024*sizeof(char));
char *args[2] = {"Hello, world!", NULL};
execve("/bin/echo", args, NULL);
}
}
}
Run Code Online (Sandbox Code Playgroud)
不会释放ptr构成main.c或其他程序的内存泄漏,或者当调用execve时它是否会被释放?
Dre*_*all 10
没有.
这不是内存泄漏. exec*()将在args数组中生成字符串数据的本地副本,然后将子进程内存映像吹掉,并将其与使用的内存映像重叠/bin/echo.基本上在exec()之后剩下的就是pid.
编辑:
User318904提出了exec()返回-1(即失败)的情况.在这种情况下,已分叉但未能执行的子进程确实在技术上有内存泄漏,但由于对失败的exec的通常响应是退出子进程无论如何,操作系统将回收内存.尽管如此,释放它可能是一个很好的习惯,如果没有其他原因,它会让你不再对此感到疑惑.