Article View: japan.comp.lang.visual-c++
Article #12Re: コンストラクタ内を避けるべき処理
From: Yuki Shiino
Date: Mon, 08 May 2000 00:00
Date: Mon, 08 May 2000 00:00
68 lines
2844 bytes
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-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>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++