(toppers-users 518) Re: TOPPERS/JSP のコンフィグレータ

Takagi, Yusei yusei-t @ mx15.freecom.ne.jp
2002年 9月 6日 (金) 21:38:29 JST


若林さん、お返事ありがとうございます。

> これを機に皆さんにお聞きしたいのですが、
>  「delete this;」はマナー違反でしょうか?

C++をよく知らない人が相手であれば体を張ってでも止めますが、どんな
制約があるかを十分理解した上で使うのであれば、必ずしもマナー違反
ではないと思います。

ただ、delete this;をやっても問題ない場合というのは、ものすごい制約が
あると思います。
私が思いつくのは、

1. インスタンスが破壊された後、thisポインタの参照外しが直接・間接
 に行われないことを保証しないといけません。
2. また、deleteする関係上、必ず new演算子で生成されることを保証
 する必要もあります。
3. さらに、そのクラスが決して派生されないこと、delete this;を行って
 いるメンバ関数が公開されていないことも必須条件です。

COMの場合、クライアントコードとの間に物理的な壁があるため、上記の
2.と3.は必ず保証されます。後はプログラマの責任で1.を満たせばよいこと
になります。
また、COMの場合、クライアント側のdelete演算子が必ずしもインスタンス
を生成したnew演算子と対にならないためにこうせざるを得ない事情があり
ます。
通常、こうしたものを扱う場合は参照カウンタを組み込んだスマートポインタ
の専用クラスを作るため、COMは特殊な部類に入ります。

普通は1.〜3.をクライアントコードに対して保証するのは並大抵のことでは
できませんし、何もdelete this;を使わなくても他の方法で実現できることが
ほとんどです。

個人的には、delete this;は gotoより危険、longjmpより安全という印象です。
それでは。

--------------
高木悠成