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;
}