带有入口点的这段代码两次调用表单的析构函数。
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);
}
第二个版本仅一次调用析构函数。
为什么最初叫它两次?
MyApp::MyForm form;
那是完全错误的。在C ++ / CLI中,知道何时在变量声明上使用^帽子非常重要。当您不使用它时(如此处所做的那样),您将调用“堆栈语义”。它是C ++ RAII模式的仿真,编译器在Main()的末尾自动向析构函数发出调用。
但这不应该发生,当您关闭窗口时,会自动调用MyForm对象的析构函数。因此,在您的情况下,您会看到它运行两次。并不是真正致命的,这与本机C ++非常不同,除非您在析构函数中对本机代码进行了一些琐碎的工作。请记住,ref类型的析构函数与对象销毁没有任何关系,这就是垃圾收集器的工作。它仅用于清理本机资源。
在MSDN文章中,有关堆栈语义的更多信息。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句