🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: japan.comp.lang.visual-c++
Article #4

Re: コンストラクタ内を避けるべき処理

#4
From: Yoshio Kiya
Date: Fri, 12 May 2000 00:00
78 lines
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-mail
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>

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++