かずきのBlog@hatena

日本マイクロソフトに勤めています。XAML + C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

void*にdeleteしてもデストラクタが呼ばれない!?

という呟きをTwitterで見たので試してみました。実に数年ぶりのC++です!まぁ、こんな小さなサンプル書くだけでもコンパイルエラー出したので、もうダメだなと思いましたorz

#include <iostream>

class A
{
public:
    A()
    {
        std::cout << "A::A()" << std::endl;
    }

    virtual ~A()
    {
        std::cout << "~A::A()" << std::endl;
    }
};

int main(int argc, char** argv)
{
    {
        std::cout << "scope" << std::endl;
        A();
    }
    {
        std::cout << "delete" << std::endl;
        A* ap = new A();
        delete ap;
    }
    {
        std::cout << "void* delete" << std::endl;
        void* ap = new A();
        delete ap;
    }
}

スコープで死んでもらうのと、明示的にdeleteするのとvoid*に代入してdeleteする3ケース試してます。

scope
A::A()
~A::A()
delete
A::A()
~A::A()
void* delete
A::A()

ほんとだ、最後に~A::A()が呼ばれてない。知らなかったな〜。