delete this の安全性
メンバー向けトレーニングネタその1。delete this は危険に見えるが何を削除しているのか確認する。
class ClassA { public: void del() { delete this; } }; int main() { ClassA* ptr = new ClassA(); ptr->del(); // ダメな例 // ClassA test; // test.del(); return 0; }
(gdb) b ClassA::del Breakpoint 1 at 0x4006aa: file test.cc, line 6. (gdb) run Breakpoint 1, ClassA::del (this=0x602010) at test.cc:6 6 delete this;
ようするに、削除されるのはオブジェクトの管理領域 (0x602010) であって、実行中のコード (0x4006aa) は .text にあるので大丈夫。別に足下を削除したわけではない。delete this 以降にメンバを参照するようなコードを書いたり、うっかりデストラクタが走ることがなければコードの整合性としては問題ない(どうしても必要な時に使う)。
追記
class ClassA { public: void destroy() { delete this; } static ClassA* create() { return new ClassA; } private: ClassA() {} ~ClassA() {} }; int main() { ClassA* ptr = ClassA::create(); ptr->destroy(); return 0; }