2

Cプログラムでは、でプログラムを終了した後、動的に割り当てられたメモリが解放されないままである場合、exit(100);メモリリークの問題が発生しますか?例えば:

int main (void) {
    char str1[] = "Hello World"
    char *str2;
    str2 = malloc(strlen(str1 + 1));

    if (str2) 
        exit(101); // memory leaks?

    free(str2);
    return 0;
}
4

3 に答える 3

4

最新のオペレーティングシステムではありません。プロセスが終了すると、OSはすべてのメモリを自動的に収集します。

実際、プログラムがとにかく終了している場合、メモリを解放するとパフォーマンスに悪影響を与える可能性があります。その理由は、呼び出しfreeには多くの作業が必要になる場合があるためです。多くの構造を更新したり、キャッシュラインに触れたりします。単に終了するだけでは、このユーザースペースの意味がすべてなくなるわけではなく、OSが実際にデータのマッピングを解除します。

于 2013-03-19T08:55:27.583 に答える
1

を使用して動的に割り当てられたすべてのメモリはmalloc、 を呼び出して明示的に解放する必要がありますfree。プログラムが割り当てられていないメモリをこのように実行し続ける間、リークと呼ばれる場合があります (まったく使用されていない場合)。ただし、プログラム/プロセスが戻ると、OS はプロセスに割り当てられたメモリを単に再利用します。OS はリークを理解せず、単にプロセスに与えたものを回収します。

于 2013-03-19T08:56:31.433 に答える
1

これは、オペレーティング システムによって異なります。最新のすべてのオペレーティング システム (私の知る限り) は、実行が完了したときに、C プログラムによって明示的に解放されていないメモリを解放します。したがって、通常の状況では結果を伴わずにこれを回避できます。実際、プログラムの実行がすぐに終了するときにメモリを解放することは不要なので、推奨しないという考え方もあります。ただし、危険な可能性がある古いまたは珍しいオペレーティングシステムを扱っている場合. これらのシステムの一部では、メモリを再度解放するために再起動が必要になる場合があります。

于 2013-03-19T08:56:51.217 に答える