2

私がC++を扱ってから数年が経ちましたので、我慢してください...

プログラムにメモリリークがあり、実行時エラーが発生します。これがエラーの原因である可能性がありますか?

グローバル変数がありますFILE *fp;

コールバック機能では、次のようになります。

fp = fopen(filen,"w");
// do some writing
fclose(fp);

このプロセスは、同じポインター(fp)で数回繰り返されます。同じファイルポインタを使用するのは問題ですか?fclose()は自動的にメモリを解放しますか、それとも手動で削除する必要がありますか?大量のテキストを書いている場合に実行時エラーを引き起こす可能性のある制限はありますか?

ありがとう!

4

4 に答える 4

5

はい、 にfclose関連付けられているすべてのリソースを解放しますFILE *。経験則として、 でfree割り当てられたものにmallocのみ使用し、 で割り当てられたものにのみ使用deleteしてnewください。

そして、同じポインターを「再利用」することは決してありません。 を呼び出すとfopen、 new が返されFILE *ます。

ところで、あなたは C++ をやっているので、調べてみることを検討してfstreamください。リソース管理を処理します。

于 2011-06-03T19:06:48.187 に答える
3

このアプローチでは、次の呼び出し の前にfopen常に a が続く限り、メモリ リークは発生しません。fclosefopen

ただし、これが実際に起こっていることである場合、グローバル変数の必要性に疑問を呈します。これをローカルにして、情報を出力する必要がある関数に渡す方が全体的にはるかに安全です。

于 2011-06-03T19:06:51.707 に答える
0

あなたは物事を正確に正しく行っているように思えます-割り当てたリソースを解放するなど、fclose何をしても逆にする必要があります。fopen

于 2011-06-03T19:07:42.130 に答える
0

複数のスレッドが同じグローバルにアクセスすると、スレッドの 1 つがファイルを閉じた後に発生する問題が発生する可能性がありました。

後でファイルを開いてファイル ポインタを変更しても、それが発生したときに認識されませんでした。

ファイルを閉じると、作成されたファイル ハンドルの 1 つだけが閉じられ、ファイル ハンドル リークが残り、ファイルへのそれ以上の書き込みは失敗し、同じハンドルで 2 回目にファイルを閉じようとすると、失敗した場合にクラッシュする可能性があります。すでにファイルへの書き込みが発生しています。

于 2011-06-03T19:14:32.207 に答える