fopenのフリーズ

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
七誌

fopenのフリーズ

#1

投稿記事 by 七誌 » 16年前

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のフリーズ

#2

投稿記事 by たかぎ » 16年前

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

バグ

Re:fopenのフリーズ

#3

投稿記事 by バグ » 16年前

というか、2度目のdeleteを実行した時点で例外が発生しないですか?(一応、VC++6.0とVS2005で確認済み)

たかぎ

Re:fopenのフリーズ

#4

投稿記事 by たかぎ » 16年前

> 2度目のdeleteを実行した時点で例外が発生しないですか?

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

七誌

Re:fopenのフリーズ

#5

投稿記事 by 七誌 » 16年前

回答ありがとうございます。

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

閉鎖

“C言語何でも質問掲示板” へ戻る