Article View: japan.comp.lang.visual-c++
Article #4Re: コンストラクタ内を避けるべき処理
From: Yoshio Kiya
Date: Fri, 12 May 2000 00:00
Date: Fri, 12 May 2000 00:00
78 lines
4167 bytes
4167 bytes
Yoshio Kiya wrote in <8fakpm$bmv$2@newsgw8.odn.ne.jp>
> # 転載すればとっても良い情報になるとは思うのですが…
転載しても良いとのメールをいただきましたので、代理投稿させ
ていただきます。
------------- ここから -----------------------------------
村山と申します。
ニュースに投稿できない環境にいるため、メールで失礼します。
> Yuki Shiino wrote in <8f44e1$7s1$1@news.cds.ne.jp>
> > X* xp = new X();
> >
> > とした際に、メモリの確保には成功したものの、X::X()が何らかの例外を
> > 投げ、インスタンスの構築に失敗した場合には、確保されたメモリは開放
> > されます。
>
> ありゃ、じゃ、私の心配は、VC固有の仕様による物のようです。
この件ですが、実はVC++においても心配は不要です。
MSDNの記述からは、メモリリークが発生するように解釈できますが、この記
述に誤まりがある、もしくは、古い版のVC++について書かれているのではな
いかと思っています。
VC++6.0では、new演算子によって生成されるオブジェクトのコンストラクタ内
で例外が発生した場合、operator delete()が呼ばれることは、実機で動作させ
たうえで確認できました。
ただし、特定の条件において、コンストラクタ内で例外を発生させた場合に
メモリリークが発生する条件は存在します。
仮引数付きのnew演算子を使用した延長で呼び出されるコンストラクタ内で
例外が発生した場合は、通常のoperator delete()は呼ばれず、
new演算子の仮引数と同じ引数を持つoperator delete()が呼ばれます。
もし、このようなoperator newに対応したoperator deleteが存在しないと、
コンストラクタ内で例外が発生した場合operator deleteを呼ばないようなコー
ドにコンパイルされます。
例えば、以下の1のoperator newを使用する場合は、2および3のoperator
deleteを定義しなくてはなりません。
1) void* operator new(size_t size, const char* signe);
2) void operator delete(void* p, const char*);
3) void operator delete(void* p);
次のようなプログラムでは、Aにおいて上記1のoperator newが呼ばれ、
Bにおいて上記3のoperator deleteが呼ばれます。
AにおいてFooのコンストラクタで例外が発生した場合は、例外をcatchする
前に2のoperator deleteが呼び出されます。
もし仮に、2のoperator deleteが定義されていない場合は、メモリリーク
が発生します。
tyr{
Foo* p = new("Object Foo") Foo; // A
delete p; // B
}catch (...){
// 例外処理
}
MSDNに記述されている、コンストラクタにおける例外の注意事項というのは
このことを指しているのかな?と個人的には思うことにしています。
# でも違うかなぁ?
# なにしろMicrosoftのことですから...
---
富士通愛知エンジニアリング 2開統)1開発部
外線 0559-24-6158 内線 7551-4181
村山 浩 murayama@ael.fujitsu.co.jp
------------- ここまで -----------------------------------
# 村山さんありがとうございました。
=== Nihon Application Co.,LTD. 木屋 善夫 kiya@nac.co.jp ===
Technical Details
Message-ID:
<8ffuu7$g82$1@newsgw8.odn.ne.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: f71b3,d8108d20cf4aa80b X-Google-Attributes: gidf71b3,public X-Google-Thread: 10a2c7,d8108d20cf4aa80b X-Google-Attributes: gid10a2c7,public From: Yoshio Kiya <kiya@asahi.email.ne.jp> Subject: Re: コンストラクタ内を避けるべき処理 Date: 2000/05/12 Message-ID: <8ffuu7$g82$1@newsgw8.odn.ne.jp> X-Deja-AN: 622406278 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> Content-Type: text/plain; charset="iso-2022-jp" X-Complaints-To: news@odn.ad.jp X-Trace: newsgw8.odn.ne.jp 958103303 16642 210.237.160.199 (12 May 2000 03:48:23 GMT) Organization: odn.ne.jp Mime-Version: 1.0 NNTP-Posting-Date: 12 May 2000 03:48:23 GMT Newsgroups: japan.comp.lang.visual-c++,fj.comp.lang.c++