这段带有入口点的代码调用了表单的析构函数两次。
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++ 非常不同,除非您在析构函数中使用本机代码做了一些不平凡的事情。请记住,引用类型的析构函数与对象销毁没有任何关系,这是垃圾收集器的工作。它仅用于清理本地资源。
有关堆栈语义的更多信息,请参阅这篇 MSDN 文章.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)