ページ 11

fopenのフリーズ

Posted: 2008年11月07日(金) 08:49
by 七誌
VC++で作成しているプログラムでfopenの関数を何度か使っていたんですが、

間違って、すでにdeleteしてあるクラスを再度deleteしてしまうプログラムを実行
してしまいました。
そのときに、delete自体でエラーは起こらなかったのですが、delete後にfopenを
使おうとするとフリーズしてしまうようになってしまいました。
その後、deleteを片方消して、再度コンパイルし、実行したときにはうまく動作しました。
一応問題はなくなったのですが、なぜこのようなことが起きたのか、どなたか教えていただけないでしょうか。

class A {
.
.
};

//
A *p;
p = new A();
.
.
delete(p);
fopen("a.data", "w"); // ←ここでは動く
.
.
delete(p); // 記述ミスでdelele済みのクラスをdelete
fopen("a.data", "w"); // ←コンパイルは通るが、実行するとフリーズ

Re:fopenのフリーズ

Posted: 2008年11月07日(金) 09:45
by たかぎ
VC++の場合、operator deleteはfree関数を用いて実装しています。
一方、fopenは、内部的なバッファを割り付けるためにmallocを呼び出しています。
すなわち、解放済みの領域に対してfreeを呼び出すことでヒープを破壊し、その後にmallocを呼び出したためにおかしくなっているのです。

Re:fopenのフリーズ

Posted: 2008年11月07日(金) 10:05
by バグ
というか、2度目のdeleteを実行した時点で例外が発生しないですか?(一応、VC++6.0とVS2005で確認済み)

Re:fopenのフリーズ

Posted: 2008年11月07日(金) 11:04
by たかぎ
> 2度目のdeleteを実行した時点で例外が発生しないですか?

VC++2008EEで試しましたが例外は発生しません。
operator deleteは例外指定がthrow()なので、デストラクタから例外を送出するようなヘマをやらない限り、delete式で例外が送出される可能性はありません。
C++/CLIなら、ThreadAbortExceptionが送出される可能性があるかもしれませんが...

Re:fopenのフリーズ

Posted: 2008年11月09日(日) 01:46
by 七誌
回答ありがとうございます。

すごく不思議に思っていたのが、すっきりしました。