C ++ delete没有找到析构函数

时间:2017-06-16 23:20:21

标签: casting c++-cli destructor

我想知道为什么〜在这种情况下不会调用Test2和~Test1:

public class Test1
{
public:
    Test1() { Console::WriteLine("Test1\n"); }
    virtual ~Test1() { Console::WriteLine("~Test1\n"); }
};

class Test2 : public Test1
{
public:
    Test2()  { Console::WriteLine("Test2\n"); }
    virtual ~Test2() { Console::WriteLine("~Test2\n"); }
};

int main(array<System::String ^> ^args)
{
    Console::WriteLine(L"Testing destructors");

    //Test1* t1 = new Test2(); // Test2 is cast as Test1
    //delete t1;

    //Console::ReadKey();
    //Console::WriteLine(L"Now void*:");

    void*  v = new Test2(); 
    delete v;

    Console::ReadKey();

    return 0;
}

这是一个
- 要求所有编译器以这种方式执行的规则?
- C ++编译器实现中的错误?
- 一个行为未定义,因此从编译器到编译器各不相同?

3 个答案:

答案 0 :(得分:1)

您需要的是基类中的虚拟析构函数。这将获得预期的行为。否则,行为未定义。

virtual ~Test1() { Console::WriteLine("~Test1\n"); }

更多细节:

答案 1 :(得分:0)

它不会调用析构函数,因为您调用delete on的指针不是指向对象类型的指针。如何删除应该知道void*指向特定类型?它不可能。所以它只是删除了内存,因为void没有析构函数。

答案 2 :(得分:0)

SOURCES=$(wildcard *.cu) 是一个void,它不是t1类型,编译器无法知道您要删除Test1。你可以试着把它扔掉:

Test1