删除管理对象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中的托管对象,您无法控制对象的销毁时间。使用gcnew
意味着你同意让垃圾收集器管理你的内存,垃圾收集器将坚持自己的时间表,并在它高兴的时候释放你的东西(并调用你的终结器)。
IDisposable
接口来处理这种情况。一次性对象有一个Dispose()
方法,你可以调用它来释放它们拥有的资源。此模式的要点是让您重新控制那些无法承担非确定性清理的资源(如文件)。
不只是将实例设置为nullptr
(您仍然需要这样做),而是首先在它上面调用Dispose
方法。这个方法负责关闭对象拥有的所有句柄。