删除托管对象c ++ / cli

时间:2014-07-16 05:17:33

标签: c# c++ command-line-interface

如何在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();

没有任何问题,但我需要“重置”它 - 创建一个新实例(并杀死旧实例) 我试过:

- 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;

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

1 个答案:

答案 0 :(得分:0)

对于C ++ / CLI中的托管对象,您无法控制对象销毁时间。使用gcnew意味着您同意由垃圾收集器管理您的内存,垃圾收集器将遵循自己的计划,并在需要时释放您的内容(并调用终结器)。

.NET Framework有一个IDisposable接口来处理这种情况。一次性对象具有Dispose()方法,您可以调用该方法来释放它们拥有的资源。这种模式的关键在于让您重新掌控资源(如文件),而这些资源是您无法以非确定性方式进行清理的。

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