这个带入口点的代码调用两次析构函数。
void Main(array<String^>^ args)
{
Application::EnableVisualStyles();
Application::SetCompatibleTextRenderingDefault(false);
MyApp::MyForm form;
Application::Run(%form);
}
我已将其更改为
void Main(array<String^>^ args)
{
Application::EnableVisualStyles();
Application::SetCompatibleTextRenderingDefault(false);
Application::Run(gcnew MyApp::MyForm);
}
第二个版本只调用析构函数一次。
为什么最初被叫两次?
答案 0 :(得分:6)
MyApp::MyForm form;
那是非常错误的。知道何时在变量声明中使用^ hat在C ++ / CLI中非常重要。当你不使用它时,就像你在这里一样,然后你调用“堆栈语义”。它是C ++ RAII模式的模拟,编译器会自动在Main()的末尾发出对析构函数的调用。
但是这不应该发生,关闭窗口时会自动调用MyForm对象的析构函数。因此,在您的情况下,您会看到它运行两次。实际上并不是致命的,与本机C ++非常不同,除非你在析构函数中使用本机代码做一些非常重要的事情。请记住,ref类型的析构函数与对象销毁没有任何关系,这是垃圾收集器的工作。它仅用于清理本机资源。
有关this MSDN article中的堆栈语义的更多信息。