🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

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

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

#11
From: Yuki Shiino
Date: Sun, 07 May 2000 00:00
51 lines
2185 bytes
 椎野です。

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

class A {};
class B {};

class X {
  private:
    A a;
    B b;
    A* ap;
    B* bp;
  public:
    X() : a(), b(), ap(0), bp(0)
    try {
        ap = new A();
        bp = new B();
        // その他例外が発生し得る処理
    }
    catch (...) {
        delete ap;
        delete bp;
        throw;
    }
    ~X() {
        delete ap;
        delete bp;
    }
};

 コンパイルチェックしていないので間違えているかもしれませんが、
こんなコードはどうでしょう。
 メンバa, bの構築時に例外が発生しても、構築済みのインスタンスに
対してはデストラクタが呼ばれるので安心して良いでしょう。
 ap, bpに対してnewでインスタンスを構築している最中に例外が発生
してもcatch(...)の中でデストラクタが呼ばれるので心配は要らないで
しょう。その他の例外が発生しても同様です。
 この方法は、構築された全てのインスタンスに対して(必要に応じて)
デストラクタを呼びます。また、メモリの開放も行うのでメモリリーク
も起きない筈です。
 コンストラクタの外で、try and catchするよりも良いと思うのですが。
それ程面倒でもないです。

 尚、しばらくの間、記事を投稿出来なくなるかもしれません。ご了承
下さい。

-- 
 椎野 裕樹   <yuki@cds.ne.jp>
Technical Details
Message-ID: <8f3v3k$4j8$3@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>

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/07
Message-ID: <8f3v3k$4j8$3@news.cds.ne.jp>
X-Deja-AN: 620290083
References: <8es3l3$kas$1@pin2.tky.plala.or.jp> <8eu2vv$pun$1@newsjp.mbn.or.jp> <8evptd$4m2$2@newsgw8.odn.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++