かずきのBlog@hatena

日本マイクロソフトに勤めています。このブログは個人ブログなので、ここに書いている内容は個人的な意見で会社の公式見解ではない点にご注意ください。好きなものは XAML と C# 。苦手なものは型の無い言語です。

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()が呼ばれてない。知らなかったな〜。