我想知道为什么〜在这种情况下不会调用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 ++编译器实现中的错误?
- 一个行为未定义,因此从编译器到编译器各不相同?
答案 0 :(得分:1)
您需要的是基类中的虚拟析构函数。这将获得预期的行为。否则,行为未定义。
virtual ~Test1() { Console::WriteLine("~Test1\n"); }
更多细节:
答案 1 :(得分:0)
它不会调用析构函数,因为您调用delete on的指针不是指向对象类型的指针。如何删除应该知道void*
指向特定类型?它不可能。所以它只是删除了内存,因为void
没有析构函数。
答案 2 :(得分:0)
SOURCES=$(wildcard *.cu)
是一个void,它不是t1
类型,编译器无法知道您要删除Test1
。你可以试着把它扔掉:
Test1