1

これは私の前の質問のフォローアップです。ここにリンクします

私の質問は次のとおりです。次のコードがあるとしましょう。

char* buf = (char*) malloc(1024);

...
for(; i<20; i++) { 
    if(read(fd, buf, 1024)   == -1) { // read off a file and store in buffer
         perror("read failed");
         return 1;
    }
    ...

}
free(buf);

私が得ようとしているのはそれです-でエラーが発生した場合はどうなりread()ますか?それは私の割り当てられたメモリが決して解放されないことを意味しますか?その場合、これをどのように処理しますか?free()エラー処理の一部として呼び出す必要がありますか?

もう一度、私は悪い英語をお詫び申し上げます。^^;

どうもありがとう、K。

4

3 に答える 3

3

はい、メモリがリークされます。

あなたはこのようにそれを行うことができます:

char* buf = (char*) malloc(1024);
int errcode = 0;

...
for(; i<20; i++) { 
    if(read(fd, buf, 1024)   == -1) { // read off a file and store in buffer
         perror("read failed");
         errcode = 1;
         break;  // or "goto cleanup;"
    }
    ...

}
free(buf);
return errcode;
于 2010-03-20T14:07:17.227 に答える
3

非常に小さなスタックを持つ非常に制約のある組み込み CPU で実行しない限り、ヒープからそのバッファーを割り当てる理由はありません。1キロバイトはピーナッツです。宣言を次のように変更します。

char buf[1024];

クリーンアップせずに関数を終了できます。

于 2010-03-20T14:44:27.150 に答える
1

エラーを回復可能と見なすかどうかによって異なります。

エラーが回復可能である可能性があり、関数がエラー コードを返す (または何らかの方法で呼び出し元に通知する) 場合は、再度使用されないメモリとその他のリソース (ファイル記述子など) を必ず解放してください。

エラーが回復できないと思われ、プログラムを終了する場合 (abortまたは同様の方法で)、リソースの解放について心配する必要はありません。プログラムが終了すると、システムがそれを処理します。

于 2010-03-20T14:50:19.747 に答える