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"); // ←コンパイルは通るが、実行するとフリーズ
fopenのフリーズ
Re:fopenのフリーズ
VC++の場合、operator deleteはfree関数を用いて実装しています。
一方、fopenは、内部的なバッファを割り付けるためにmallocを呼び出しています。
すなわち、解放済みの領域に対してfreeを呼び出すことでヒープを破壊し、その後にmallocを呼び出したためにおかしくなっているのです。
一方、fopenは、内部的なバッファを割り付けるためにmallocを呼び出しています。
すなわち、解放済みの領域に対してfreeを呼び出すことでヒープを破壊し、その後にmallocを呼び出したためにおかしくなっているのです。
Re:fopenのフリーズ
> 2度目のdeleteを実行した時点で例外が発生しないですか?
VC++2008EEで試しましたが例外は発生しません。
operator deleteは例外指定がthrow()なので、デストラクタから例外を送出するようなヘマをやらない限り、delete式で例外が送出される可能性はありません。
C++/CLIなら、ThreadAbortExceptionが送出される可能性があるかもしれませんが...
VC++2008EEで試しましたが例外は発生しません。
operator deleteは例外指定がthrow()なので、デストラクタから例外を送出するようなヘマをやらない限り、delete式で例外が送出される可能性はありません。
C++/CLIなら、ThreadAbortExceptionが送出される可能性があるかもしれませんが...