4

この無意味なプログラムを考えてみましょう:

/* 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);
        }
    }
}

解放ptrすると、main.c または他のプログラムのメモリ リークが発生しませんか? それとも、execve が呼び出されたときに解放されますか?

4

3 に答える 3

10

いいえ。

これはメモリリークではありません。 exec*()args配列内の文字列データのローカルコピーを作成し、子プロセスのメモリイメージを吹き飛ばして、によって使用されるメモリイメージとオーバーレイし/bin/echoます。基本的に、exec()の後に残るのはpidだけです。

編集:

User318904は、exec()が-1を返す場合(つまり、失敗)を提起しました。この場合、forkしたが実行に失敗した子プロセスには、実際には技術的にメモリリークがありますが、失敗したexecに対する通常の応答は、とにかく子プロセスを終了することであるため、メモリはOSによって再利用されます。それでも、それを解放することは、それ以外の理由がなければ、後でそれについて不思議に思うことを防ぐのであれば、おそらく入るのに良い習慣です。

于 2010-09-20T23:00:41.000 に答える
3

execveが-1を返す場合、はい。そうでなければ、多分。

于 2010-09-20T23:04:04.993 に答える
0

割り当てられたメモリは、によって解放される必要がありますexec。通話が完了すると、とにかくアクセスできなくなります。

于 2010-09-20T23:00:12.250 に答える