如何在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;
但旧对象不会死,例如,旧对象打开的文件被锁定,直到我退出应用程序。
答案 0 :(得分:0)
对于C ++ / CLI中的托管对象,您无法控制对象销毁时间。使用gcnew
意味着您同意由垃圾收集器管理您的内存,垃圾收集器将遵循自己的计划,并在需要时释放您的内容(并调用终结器)。
.NET Framework有一个IDisposable
接口来处理这种情况。一次性对象具有Dispose()
方法,您可以调用该方法来释放它们拥有的资源。这种模式的关键在于让您重新掌控资源(如文件),而这些资源是您无法以非确定性方式进行清理的。
您不必将实例设置为nullptr
(您仍然需要这样做),而是首先在其上调用Dispose
方法。此方法负责关闭对象拥有的所有句柄。