Winform析构函数被调用两次

Winform destructor getting called twice

我有一个标准的 c++cli win32 winform 应用程序,由 VS2013 模板制作。

第一次调用returns到不可调试的位置"C:\Windows\SysWOW64\user32.dll"

Main()Application::Run(%instance); 之后的第二个 returns:

Application::EnableVisualStyles();
Application::SetCompatibleTextRenderingDefault(false);

PorjectName::UserClass instance;
Application::Run(%instance);

我认为这不会造成任何伤害,但我很想知道为什么会这样。

这种行为是 winforms c++cli 对象工作方式固有的吗?我怎样才能找出是什么原因造成的?

我遵循了这个指南:http://www.bogotobogo.com/cplusplus/application_visual_studio_2013.php

   PorjectName::UserClass instance;

这就是造成它的原因。 UserClass 是引用类型,您通常声明一个变量,该变量存储对带有 ^ 帽子的对象的引用。但你没有,你现在调用了一个名为 "stack semantics" 的模式。它模拟原生 C++ 中的 RAII 模式,编译器自动发出对右大括号处的析构函数的调用。

这不适用于从 Form 或 Control 派生的 class。此类对象已经自动处理,它发生在 window 关闭之后。所以你看到 两次 调用析构函数,第一个来自 Winforms,第二个来自 Main() 函数中隐藏的析构函数调用。

这实际上不是托管代码中的错误,实际上在某些 classes 中很常见。例如,从 Stream 派生的 classes 几乎是不可避免的。请记住,终结器扮演的角色相当于原生 C++ 析构函数,即 C++/CLI 语法中的 !classname。然而,如果你不指望它,很容易把你的腿打断。

只要把代码写好:

ProjectName::UserClass^ instance = gcnew ProjectName::UserClass;
Application::Run(instance);

auto instance = gcnew ProjectName::UserClass;
Application::Run(instance);

Application::Run(gcnew ProjectName::UserClass);