Article View: japan.comp.lang.visual-c++
Article #3Re: コンストラクタ内を避けるべき処理
From: 電子のお針箱
Date: Wed, 10 May 2000 00:00
Date: Wed, 10 May 2000 00:00
80 lines
3742 bytes
3742 bytes
Yoshio Kiya <kiya@asahi.email.ne.jp> wrote in message
news:8fakpm$bmv$2@newsgw8.odn.ne.jp...
> > MSDN により引用
> > > 例外処理 : コンストラクタの例外処理
> 以下略
>
> 昨日メールにてフォローしていただいたのですが、その方の説明
> によると、どうやら、この記述は間違いのようです。
>
> VCにおいてコンストラクター内で例外を発生させてオブジェクト
> のメモリーが解放されることは確認済みだそうです。
どうもその様ですね。new された時に困るのだから、その時は自分で delete する
様にすれば良いやということで、ちょっと無理矢理ですが...
#include <stdio.h>
class CHoge {
private:
static int by_new; // new で生成されたかフラグ
public:
CHoge(const int b);
void *operator new(size_t size);
};
int CHoge::by_new = 0; // 普通は、new じゃ無いよ...
void CHoge::operator new(size_t size)
{
by_new = 1; // new で生成されたら覚えておいて...
return ::new(size);
}
CHoge::CHoge(const int b)
{
int by_new1 = by_new; // by_new1 は本来不要だが by_new を 0 に
by_new = 0; // 戻すのを忘れない為にコピーを作っておく。
if(b){ // 例外が発生する状況では...
if(by_new1){ // new で生成されていたら...
delete this; // 自分自身を削除
}
throw b;
}
}
int main()
{
try {
CHoge *p = new CHoge(1);
}
catch(int b){
printf("Exception: %d\n", b);
}
}
と言うようなクラスを作成して、new された時のコンストラクターで例外が発生する
時は自分で delete する様に作ったのですがどうも「自分自身を削除」とコメントさ
れている delete は実行しているのですが、その後の throw において assert() (解
放しようとした領域が不正) で引っかかってしまいます。また、ちょっと変更して
new されたポインタを覚えておいて例外処理後に delete しようとすると同じく
assert() で引っかかります。
本当に解放しているかステップ実行で追いかけたのですが VC++ 4.0 では例外は
Win32 の構造化例外を使っているようで追いきれていません...。
> ただ、特殊な状況において発生する可能性について述べているの
> かもしれないともおっしゃっていました。
確かに、ドキュメント化されていないのはちょっと不安ですよね。
# ドキュメント化されていても不安なのに...。(^_^)
--
--------------
電子のお針箱
ueno@di.mbn.or.jp
(From: ヘッダーはスパム対策のため -nospam を付加しています。)
--------------
Technical Details
Message-ID:
<8fbn8e$jls$2@newsjp.mbn.or.jp>Path:
arc1-ca.pugleaf.net!unknown!not-for-mailReferences:
<8es3l3$kas$1@pin2.tky.plala.or.jp> <8eu2vv$pun$1@newsjp.mbn.or.jp> <8evptd$4m2$2@newsgw8.odn.ne.jp> <8f3v3k$4j8$3@news.cds.ne.jp> <8f44e1$7s1$1@news.cds.ne.jp> <8f5cue$rjs$2@newsgw8.odn.ne.jp> <8fakpm$bmv$2@newsgw8.odn.ne.jp>Show Full Headers
Complete Article Headers
X-Google-Language: Japanese,JIS X-Google-Thread: 10a2c7,d8108d20cf4aa80b X-Google-Attributes: gid10a2c7,public X-Google-Thread: f71b3,d8108d20cf4aa80b X-Google-Attributes: gidf71b3,public From: 電子のお針箱 <ueno-nospam@di.mbn.or.jp> Subject: Re: コンストラクタ内を避けるべき処理 Date: 2000/05/10 Message-ID: <8fbn8e$jls$2@newsjp.mbn.or.jp> X-Deja-AN: 621554416 Content-Transfer-Encoding: 7bit References: <8es3l3$kas$1@pin2.tky.plala.or.jp> <8eu2vv$pun$1@newsjp.mbn.or.jp> <8evptd$4m2$2@newsgw8.odn.ne.jp> <8f3v3k$4j8$3@news.cds.ne.jp> <8f44e1$7s1$1@news.cds.ne.jp> <8f5cue$rjs$2@newsgw8.odn.ne.jp> <8fakpm$bmv$2@newsgw8.odn.ne.jp> X-Priority: 3 Content-Type: text/plain; charset="iso-2022-jp" X-MimeOLE: Produced By Microsoft MimeOLE V5.00.2615.200 X-Complaints-To: news@mbn.or.jp X-Trace: newsjp.mbn.or.jp 957964366 20156 210.144.154.207 (10 May 2000 13:12:46 GMT) Organization: MediaBank,Tokyo,JAPAN X-MSMail-Priority: Normal Mime-Version: 1.0 NNTP-Posting-Date: 10 May 2000 13:12:46 GMT Newsgroups: japan.comp.lang.visual-c++,fj.comp.lang.c++