🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

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

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

#3
From: 電子のお針箱
Date: Wed, 10 May 2000 00:00
80 lines
3742 bytes
Yoshio Kiya <kiya@asahi.email.ne.jp> wrote in message
news:8fakpm$bmv$2@newsgw8.odn.ne.jp...

> >  MSDN により引用
> > > 例外処理 : コンストラクタの例外処理
> 以下略
>
>  昨日メールにてフォローしていただいたのですが、その方の説明
> によると、どうやら、この記述は間違いのようです。
>
>  VCにおいてコンストラクター内で例外を発生させてオブジェクト
> のメモリーが解放されることは確認済みだそうです。

  どうもその様ですね。new された時に困るのだから、その時は自分で delete する
様にすれば良いやということで、ちょっと無理矢理ですが...

#include <stdio.h>

class CHoge {
private:
  static int by_new;     // new で生成されたかフラグ
public:
  CHoge(const int b);
  void *operator new(size_t size);
};

int CHoge::by_new = 0;   // 普通は、new じゃ無いよ...

void CHoge::operator new(size_t size)
{
  by_new = 1;            // new で生成されたら覚えておいて...
  return ::new(size);
}

CHoge::CHoge(const int b)
{
  int by_new1 = by_new;  // by_new1 は本来不要だが by_new を 0 に
  by_new = 0;            // 戻すのを忘れない為にコピーを作っておく。

  if(b){                 // 例外が発生する状況では...
    if(by_new1){         // new で生成されていたら...
      delete this;       // 自分自身を削除
    }
    throw b;
  }
}

int main()
{
  try {
    CHoge *p = new CHoge(1);
  }
  catch(int b){
    printf("Exception: %d\n", b);
  }
}

と言うようなクラスを作成して、new された時のコンストラクターで例外が発生する
時は自分で delete する様に作ったのですがどうも「自分自身を削除」とコメントさ
れている delete は実行しているのですが、その後の throw において assert() (解
放しようとした領域が不正) で引っかかってしまいます。また、ちょっと変更して
new されたポインタを覚えておいて例外処理後に delete しようとすると同じく
assert() で引っかかります。

  本当に解放しているかステップ実行で追いかけたのですが VC++ 4.0 では例外は
Win32 の構造化例外を使っているようで追いきれていません...。

>  ただ、特殊な状況において発生する可能性について述べているの
> かもしれないともおっしゃっていました。

  確かに、ドキュメント化されていないのはちょっと不安ですよね。

# ドキュメント化されていても不安なのに...。(^_^)

--
--------------
電子のお針箱
ueno@di.mbn.or.jp
(From: ヘッダーはスパム対策のため -nospam を付加しています。)
--------------
Technical Details
Message-ID: <8fbn8e$jls$2@newsjp.mbn.or.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: 10a2c7,d8108d20cf4aa80b
X-Google-Attributes: gid10a2c7,public
X-Google-Thread: f71b3,d8108d20cf4aa80b
X-Google-Attributes: gidf71b3,public
From: 電子のお針箱 <ueno-nospam@di.mbn.or.jp>
Subject: Re: コンストラクタ内を避けるべき処理
Date: 2000/05/10
Message-ID: <8fbn8e$jls$2@newsjp.mbn.or.jp>
X-Deja-AN: 621554416
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>
X-Priority: 3
Content-Type: text/plain; charset="iso-2022-jp"
X-MimeOLE: Produced By Microsoft MimeOLE V5.00.2615.200
X-Complaints-To: news@mbn.or.jp
X-Trace: newsjp.mbn.or.jp 957964366 20156 210.144.154.207 (10 May 2000 13:12:46 GMT)
Organization: MediaBank,Tokyo,JAPAN
X-MSMail-Priority: Normal
Mime-Version: 1.0
NNTP-Posting-Date: 10 May 2000 13:12:46 GMT
Newsgroups: japan.comp.lang.visual-c++,fj.comp.lang.c++