12

これは短いコード スニペットでexit(3)、失敗した場合に備えて を 2 回呼び出します。これらの呼び出しは、malloc によって割り当てられたメモリの割り当てを解除しますか? Google 検索では、あると表示されますが、そうでない場合も多くあります...

free() を追加する必要がありますか?

また、どちらが良いですif (!word)か(たとえば、word == 0 は word == NULL とは異なるため、間違っていると思います)またはif (word == NULL)?

char *word = NULL, *temp = NULL;
    word = (char *)malloc(sizeof(char) * size);

    if (!word) {            /* or maybe rather it should be (word == NULL)  */
        perror("malloc fail");
        if (fclose(fp)) {
            perror("fclose fail");
            exit(3);                            /* exit without free ? */
        }
        exit(3);                                /* exit without free ? */
    }

前もって感謝します!

4

4 に答える 4

17

はい、すべてのメモリが返されます。ところで、とにかく終了後に残ったメモリをどうしたいですか?
または、メモリ リークが心配exit()ですか? メモリが再利用されない場合、プロセスが終了するたびにメモリがもう少しリークすることになります。これは信頼できる OS では不可能なことです。したがって、バグのある OS を除いて、メモリについて心配するのをやめて、exit()必要な場所で使用してください。

コードのコメントの質問に答えるために、解放するかどうか、私は適切なソフトウェア エンジニアリングであると思いfreeますmalloc。それが難しそうに見える場合は、コードに構造的な問題があることを示しています。終了する前にすべてのメモリを解放する利点は、valgrind のような強力なツールを使用して、コードの残りの部分でメモリ リークをチェックできることです

malloc が失敗した後は、結果を解放しようとしても意味がないことに注意してください。とにかく、それはヌル ポインターです。

そして第三に、私はどちらかを好むif (pointer == NULL)if (!pointer)、これは完全に主観的なものであり、両方を読んで理解することができる:-)

于 2012-08-23T13:30:10.873 に答える
8

電話をかけた後、exitあなたはmalloc友達を超えていますが、OSはすべてを取り戻します。mallocOS とプロセスの間の便利な仲介者と考えてください。

于 2012-08-23T13:25:06.077 に答える
3

exit の 2 回の呼び出しで、メモリの割り当てに失敗したため、そのポインタを解放しても意味がありません (C ランタイム システムの古さによっては、クラッシュする可能性があります)。

いいえ、存在しないため、解放しないでください。

そのような致命的なエラーが発生した場合、おそらくメモリを解放する必要はないと思います。

ただし、プログラムが正常に終了する場合は、割り当てたすべてのメモリを解放してみてください。それは時々非常に難しい場合があります。

于 2012-08-23T14:20:53.420 に答える
1

プログラムを終了すると、割り当てられたすべてのメモリが OS によって回収されます (スタックとヒープの両方)。バッファオーバーフローなどによってプログラムのメモリ外で作業しない限り、プログラムはRAMにフットプリントを残しません。

于 2012-08-23T13:31:23.257 に答える