掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.26469

オープンしてないファイルをクローズする
投稿者---だん(2006/03/20 10:41:53)


a::a()
{
pFile = new CStdioFile;
}
a::~a()
{
if(pFile){
try{
pFile->Close();
}
catch(CFileException e){
// Nothing is done.
}
delete pFile;
}
}

上記のようなコンストラクタとデストラクタをもつ
クラスを作成しました。

実行しクラスを生成したところ
pFile->Close();で下記のようなエラーがでました

Microsoft Visual C++ Debug Library

Debug Assertion Failed!

Program: ...\Debug\aaa.exe
File: filetxt.cpp
Line: 267

For information on how your program can cause an assertion
failure, see the Visual C++ documentation on asserts.

(Press Retry to debug the application)

リリースモードでは上記エラーは発生しません。
上記クラスは妥当でしょうか妥当でないのでしょうか

VC++6.0 MFCを使っています


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:オープンしてないファイルをクローズする 26472 YuO 2006/03/20 10:57:14


No.26472

Re:オープンしてないファイルをクローズする
投稿者---YuO(2006/03/20 10:57:14)


>リリースモードでは上記エラーは発生しません。
>上記クラスは妥当でしょうか妥当でないのでしょうか

Assertionが発生する時点で明らかに妥当ではありません。
ReleaseモードでAssertionが発生しないのは,Assertマクロを(MFC内部で)使っているからです。

せっかく
>File: filetxt.cpp
>Line: 267
と,どこでAssertionを発生させたか書いておいてくれているのですから,
MFCのソースをちゃんと確認してみればよいでしょう。

VC++ 6.0のMFCのソースを見ると,
    ASSERT(m_pStream != NULL);

とありました。これは,m_pStreamがNULLの時にCloseが呼ばれることはない,と言っています。
つまり,ファイルを開かずに,CStdioFile::Closeを呼んだことが間違いです。



この投稿にコメントする

削除パスワード

No.26473

Re:オープンしてないファイルをクローズする
投稿者---だん(2006/03/20 11:18:34)


>と,どこでAssertionを発生させたか書いておいてくれているのですから,
>MFCのソースをちゃんと確認してみればよいでしょう。
MFCのソースって読めるんですね
しりませんでした。勉強になりました。

さて、そこで質問なのですが、
皆様はファイルを閉じる処理をどのようにしてるのでしょうか?

自分は、
・ファイルクラスの解放と
・ファイルのクローズを
デストラクタで実行することにより、
自動的にやろうと思っていたのですが...
これだと上記2点を忘れることがなく
いい案だと思ってたのですが、
ファイルが開いているか開いていないか判別できますでしょうか?


この投稿にコメントする

削除パスワード

No.26474

Re:オープンしてないファイルをクローズする
投稿者---だん(2006/03/20 11:25:55)


自己レスです。

MSDNを読んでいたのですが、
デストラクタでAbortを呼ぶのが、
自分の目的に一番あっていると思いました。

おさわがせしました。



この投稿にコメントする

削除パスワード

No.26493

Re:オープンしてないファイルをクローズする
投稿者---Ban(2006/03/21 06:30:29)


>MSDNを読んでいたのですが、
>デストラクタでAbortを呼ぶのが、
>自分の目的に一番あっていると思いました。

ご本人が一番あってると思う解決策を超えるものではありませんが、
一般的な話として参考までに。

通常、デストラクタで解放するリソースは、コンストラクタで作成します。
コンストラクタで作成に失敗した場合に例外を投げると、デストラクタは
呼ばれません。このようにしておけば、デストラクタ時点では、必ず
オープン済みの状態にあることになります。
# 使うときには、オープンする時点で new 等を行うことになります。

または、オブジェクトの存続期間の途中でオープンを許す場合、
内部に現在オープン済みか否かの情報を持つ/ファイルのディスクリプタ/
ハンドルを無効にしておく等により、デストラクタでは無効でない場合のみ
クローズするような実装も、よく見かけます。



この投稿にコメントする

削除パスワード

No.26496

Re:オープンしてないファイルをクローズする
投稿者---REE(2006/03/21 10:54:13)


>ご本人が一番あってると思う解決策を超えるものではありませんが、
>一般的な話として参考までに。

ついでに、CStdioFileの場合であれば、明示的にCloseしなくても、
デストラクタで勝手にCloseしてくれます。



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧