• ベストアンサー

fcloseで発生するエラーについて。

昨日「windowsプログラムのデバッグ」で投稿させて頂いた者です。 要点は「どのようなときにfcloseがエラーをおこすか」です。 Windowsプログラムでバグを探したところデバッグ用のログ出力ファイルを fcloseする時にエラーがおこりプログラムがエラーを起こして終了している ことがわかりました。 プログラムを実行させて一定操作を行うと、プログラムの最後に行われるfcloseでエラーが起こります。 プログラムを実行させてそのまま(×等で)終了させたときにはエラーが起こらずに正常な書き込みがされているので、 メッセージの処理等をしている間に変な処理を入れてしまているのだと思いますが、 実際にログファイルへの書き込みはfcloseの直前までできているのでなぜエラーが起こるのかよくわかりません。 if((fp=fopen("log.txt","w")==NULL)return -1; とやっているのでfopenは成功していると思います。 fcloseがエラーとなるのはどのような原因が考えられるのでしょうか。 「意味がわからないので~を説明しろ」等でも構いませんのでご回答お願いいたします。 【環境】 VC6.0++ProffessionalEdition windows2000 【その他】 -エラー文の内容- "0x77fcc465"の命令が"0xfffdfffa"のメモリを参照しました。 メモリが"read"になることはできませんでした。

質問者が選んだベストアンサー

  • ベストアンサー
  • muyoshid
  • ベストアンサー率72% (230/318)
回答No.1

こんにちわ。 一つ確認させて下さい。 fclose の直後に、別の処理を追加してみて下さい。 → 別のファイルにログを採取するようなものだけで結構です。 これで、log.txtのfclose が正常に動作するようであれば、 スタックを壊してしまっているために、異常なリターンアドレスに 復帰しようとした可能性が高いです。 → 獲得したローカル変数に領域を越えてデータを読み込んで   しまった時等に、このようなエラーが発生する事があります。   (fclose の問題ではなく、呼び出し元の関数に復帰する時に   エラーとなった事が考えられます。) スタック破壊の場合、問題の関数内の処理の一部をコメントアウトして、 エラーが発生するかどうかを調べると、比較的容易に問題の箇所を 特定できると思います。

k_shin
質問者

補足

すみません。別の箇所でバグが発生してしまい 今確認ができない状態です。 申し訳ございません。 確認が済み次第お礼の欄に書かせて頂きます。 なお別のバグに関する質問を投稿させて頂きます。 よろしくお願いいたします。

その他の回答 (2)

  • isobeman
  • ベストアンサー率41% (17/41)
回答No.3

>fclose((_iobuf *)0xffdffee));という事でしょうか。 ということです。 どんな引数を与えると、そのエラーが出るのか?を試した結果です。 ただ確認しただけで、あまり意味はありません。 さらに質問です。 ・ちなみに、そのファイル処理は、一つの関数の中で完結していますか? ・それとも、ログファイル用のクラスがあって、そのコンストラクタ、デストラクタで、ファイルのオープン・クローズを処理していたりしませんか? もし、後者の場合、クラスのコピーを考慮しないと、コピーのデストラクタで、ファイルがクローズされてしまい、オリジナルのデストラクタでの処理がエラーになる事があります。この場合、参照カウンタや、コピーフラグなどをクラスに持たせて、最後のインスタンス、もしくはオリジナルのみが、ファイルのクローズを行うようにする必要があります。 はずしていたら、ごめんなさい。

k_shin
質問者

お礼

大変遅くなって申し訳ありません。 質問についてはちゃんと正しく処理がされていることを確認いたしました。 途中の箇所の修正をしているうちにこのバグにたどりつけなくなってしまった為返事が遅れてしまいました。 現在、ほとんど動くようになったのですがどうやらこのバグは発生しなくなりました。 どこかでミスってたのかもしれません。すみません・・。 だいぶ進んできたのですが更に謎のバグが発生したので更に投稿させて頂きます。 ありがとうございました。

  • isobeman
  • ベストアンサー率41% (17/41)
回答No.2

ファイルポインタがどこかで書き変わってしまっていませんか? もしくは、違うファイルポインタだったとか。 もしくは、別の場所で、すでに1度閉じられていたとか。 もしくは、ポインタをずらしてしまったとか。 あまり役に立つ情報ではありませんが、fclose()に、(_iobuf *)0xfffdffeeを引数として与えると、...が "0xfffdfffa"のメモリを参照... というエラーがでました。

k_shin
質問者

補足

回答と質問ありがとうございます。 ファイルポインタは一つのみ。 fopen、fcloseともに一つずつです。 fprintf以外でファイルポインタの使用はしておりません。 おそらく以上の条件からこの点に置いてもんだいはないと おもいます。ありがとうございます。 (_iobuf *)oxfffdffeeというのが何かわからないので 申し訳ございませんが説明をお願いいたします。 fclose((_iobuf *)0xffdffee));という事でしょうか。

関連するQ&A