自殺
C++ではオブジェクトの自殺が認められている。具体的には
class Class { public: static Class* create() { return new Class(); } private: Class() { } ~Class() { } Class(const Class& other) { } Class& operator=(const Class& other) { return *this; } public: void suicide() { delete this; } }
という感じだ。このクラスはcreate()によって生成され、suicide()によって消滅する。重要なのはコンストラクタやデストラクタなどの暗黙に定義される操作をprivateにしておくことだ。これによりcreate()、suicide()以外の手段による生成、消滅を防ぐことが出来る。
実のところdelete thisが使えること自体は元々知っていたのだが、使い道なんてないと思っていた。でも超スマートポインタの実装で利用したのだよな。参照カウントがなくなったら消滅するというように、操作の結果によってdeleteするかどうかが変わる場合を考えて欲しい。外部でdeleteを使うとしてらその操作を行うたびに返り値をチェックしてdeleteしなければならない。逆にdelete thisならば操作・チェック・deleteを一体として扱える。もちろん、操作を行った後は無効なポインタとなっている可能性があることに注意しなくてはならないが。