.net 如何确保调用析构函数?

.net 如何确保调用析构函数?,.net,c++-cli,.net,C++ Cli,我有一个子类System::Windows::Forms::UserControl,它分配一些必须在析构函数中释放的非托管资源。它通过WindowsFormsHost在WPF应用程序中使用。如果控件在应用程序中至少显示一次,则将调用其析构函数。但是,如果控件的实例已创建但从未显示,则只调用finalizer 为什么会发生这种情况?默认情况下,CLI类包装器实现了IDisposable。如果不在实例上调用MyCLIClass::Dispose(),则不会调用析构函数。我不是WPF专家,但当您显示控

我有一个子类System::Windows::Forms::UserControl,它分配一些必须在析构函数中释放的非托管资源。它通过WindowsFormsHost在WPF应用程序中使用。如果控件在应用程序中至少显示一次,则将调用其析构函数。但是,如果控件的实例已创建但从未显示,则只调用finalizer


为什么会发生这种情况?

默认情况下,CLI类包装器实现了
IDisposable
。如果不在实例上调用
MyCLIClass::Dispose()
,则不会调用析构函数。我不是WPF专家,但当您显示控件时,必须将引用传递给处理该控件的其他类。如果不调用,则永远不会调用它。

调用IDisposable::Dispose()将调用~destructor。这是一个可选调用,必须由其他代码显式执行。当您将控件添加到容器(如窗体或面板)的控件集合中,并且容器得到正确处置时,就会得到它。当用户单击“关闭”按钮关闭窗口时,通常是自动关闭的

很多情况下,这种“自动”不起作用。臭名昭著的是,当您自己通过调用Controls::remove/At()或Controls::Clear()方法删除控件时。当您仅使用gcnew创建实例,但却从未通过将其添加到容器控件而使其可见时,它肯定不会自动执行。ControlsCollection类无法完成其工作


可选呼叫需要由保证呼叫进行备份。您必须始终执行以下操作!需要释放非托管资源时的终结器。因此,无论出于何种原因,当使用控件的代码跳过可选调用时,它们永远不会泄漏。那个稍后将调用终结器。

强制类的用户调用析构函数的最佳方法是什么?在终结器中引发异常?