🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

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

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

#12
From: Yuki Shiino
Date: Mon, 08 May 2000 00:00
68 lines
2844 bytes
 椎野です。

 遅まきながら、違うことを心配しているのかもしれないことに気付きま
した。

木屋さんの記事<8evptd$4m2$2@newsgw8.odn.ne.jp>から
>  私はこれで良く悩んでいるのですが、コンストラクターで例外を
> 発生させた場合、メモリーの解放が面倒ではありませんか?

  5.3.4  New                                                  [expr.new]

17If any part of the object initialization described above17) terminates
  by throwing an exception and the new-expression  does  not  contain  a
  new-placement,        then       the       deallocation       function
  (_basic.stc.dynamic.deallocation_, _class.free_) is called to free the
  memory  in  which  the  object  was being constructed, after which the
  exception continues to propagate in the context of the new-expression.

  17) This may include evaluating a  new-initializer  and/or  calling  a
  constructor.

とあるので、

X* xp = new X();

とした際に、メモリの確保には成功したものの、X::X()が何らかの例外を
投げ、インスタンスの構築に失敗した場合には、確保されたメモリは開放
されます。
 従って、わざわざ、

X* xp = 0;
try {
    xp = new X();
}
catch (...) {
    delete xp;
}

とする必要はありません。

 コンストラクタ内で2回以上newを使ってサブオブジェクトを構築する
場合には、先の記事の様にする必要があります。2回目のnewで失敗して
も1回目のnewで構築したオブジェクトの破棄(デストラクタの呼び出し
とメモリの開放)は行われませんから。
 勿論、この話はコンストラクタ内には限りません。

X* xp1 = new X();
X* xp2 = new X(); // ここで例外発生が発生してもxp1が指すオブジェ
                  // クトは破棄されない。

 この様な場合には、auto_ptrを活用するか、例外を捕まえる必要があり
ます。

auto_ptr<X> xp1(new X());
auto_ptr<X> xp2(new X()); // ここで例外が発生しても問題ない。

X *xp1=0, *xp2=0;
try {
    xp1 = new X();
    xp2 = new X();
}
catch (...) {
    delete xp1;
    delete xp2;
}

-- 
 椎野 裕樹   <yuki@cds.ne.jp>
Technical Details
Message-ID: <8f44e1$7s1$1@news.cds.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>

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: Yuki Shiino <yuki@cds.ne.jp>
Subject: Re: コンストラクタ内を避けるべき処理
Date: 2000/05/08
Message-ID: <8f44e1$7s1$1@news.cds.ne.jp>
X-Deja-AN: 620313492
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>
Content-Type: text/plain; charset=iso-2022-jp
Organization: none
Mime-Version: 1.0
Newsgroups: japan.comp.lang.visual-c++,fj.comp.lang.c++