为什么析构函数调用两次表单?

西伯利亚人

带有入口点的这段代码两次调用表单的析构函数。

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章