かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

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