めっちゃハマったので自分用メモ。
結論から言うと、fclose(Fp);後にFp = NULL;とやると、落ちる。
なんでそんな事したかというと、自分用の軽量fsteramクラス作ろうとしたんですよ。
で、STLのfstream同様デストラクタでファイル閉じるようにしたかったんですが、ファイル開いてる時のみfclose()呼ぶようにしたいなと思ったのです。そこで、ファイルを開いてるかどうかをFILE *Fp;がNULLかどうかで判断してたんですが、これが間違いの始まりだった。
デバッガで挙動追ってて気づいたんですが、fclose(Fp);としてもFpはNULLにならないんですよね。ファイルオープンに失敗するとNULLなので、てっきりfclose後もNULLだと思ってました。
じゃぁ閉じた後ならNULLにしとけばいーじゃん、とfclose後にFp=NULL;を挟んだんですが、これがやばかった。fclose(Fp);fopen("hoge.some",Fp);は普通にできるので、ファイル閉じた後ならファイルポインタに何入れてもいいと思ってました。
が、これは違うようで、プログラム終了直前で落ちるようになってしまい、原因なんなのかわかりませんでした。
色々試行錯誤した結果なんとか特定はしましたが、fclose後の挙動って実は一切知らないので、そもそもファイル読み書きとはどれ程高度なことなのか、勉強しなおさなきゃなーと思いました。。
意外と知らないfcloseの先
Re: 意外と知らないfcloseの先
fcloseの挙動を知らなくても、fcloseの引数を見ればFpがNULLにならないことは自明です。
Fpのアドレス(ポインタのポインタ)を渡さない限り、Fpを書き換えることはできないですから。
あと、fclose後にFp=NULL;を挟むこと自体は問題ないと思うので原因は別にあるのではないかと思います。
Fpのアドレス(ポインタのポインタ)を渡さない限り、Fpを書き換えることはできないですから。
あと、fclose後にFp=NULL;を挟むこと自体は問題ないと思うので原因は別にあるのではないかと思います。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
Re: 意外と知らないfcloseの先
fclose後にFp=NULL;で落ちるのは、ありえないのですね。別の問題が有ると思います。