删除管理对象c++/cli

本文关键字:cli c++ 对象 管理 删除 | 更新日期: 2023-09-27 18:13:12

如何在c++/cli中删除托管对象?它有点特别。

一个例子:

//.h
ref class Myclass
{
public:
static Myclass^ GetInstance(void); 

private:
    static Myclass ^m_hInstance;
}
//.cpp
Myclass^ Myclass::GetInstance(void)
{
    if (m_hInstance == nullptr)
    {
        System::Windows::MessageBox::Show("mknew");
        m_hInstance = gcnew Myclass();
    }
    return m_hInstance;
}
.
.
.

所以我可以在所有的Win32 dll函数中使用

Myclass::GetInstance()->MyFunction();

工作没有任何问题,但我需要"重置"它-创建一个新的实例(并杀死旧的)I tried:

- delete Myclass::GetInstance(); (outside)
- delete m_hInstance; (inside class with a shutdown function)
- added a (empty) ~Destructor
- Myclass::GetInstance()->Dispose() (this wont work, not a Member)

(毕竟GC::Collect())

唯一的方法是设置

m_hInstance = nullptr;

但是旧对象不会死,例如,旧对象打开的文件会被锁定,直到退出应用程序。

删除管理对象c++/cli

对于c++/CLI中的托管对象,您无法控制对象的销毁时间。使用gcnew意味着你同意让垃圾收集器管理你的内存,垃圾收集器将坚持自己的时间表,并在它高兴的时候释放你的东西(并调用你的终结器)。

. net框架有一个IDisposable接口来处理这种情况。一次性对象有一个Dispose()方法,你可以调用它来释放它们拥有的资源。此模式的要点是让您重新控制那些无法承担非确定性清理的资源(如文件)。

不只是将实例设置为nullptr(您仍然需要这样做),而是首先在它上面调用Dispose方法。这个方法负责关闭对象拥有的所有句柄。