2014-07-16 48 views
0

如何刪除託管對象在C++/cli中? 它有點特別。刪除託管對象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(); 

是沒有任何問題的作品使用,但我需要「重啓」了 - 創建一個新的實例(並殺死舊) 我tryed:

- 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後::收集())

的唯一辦法是,設置

m_hInstance = nullptr; 

,但舊的對象不會死,例如,舊的對象時打開的文件被鎖定,直到我退出應用程序。

+0

如何使用close()等方法先進行清晰的清理? – deviantfan

回答

0

對於C++/CLI中的託管對象,您無法控制對象銷燬時間。使用gcnew意味着您同意讓垃圾收集器管理您的內存,垃圾收集器將堅持自己的計劃,並在您滿意時釋放您的內容(並調用您的終結器)。

.NET Framework有一個IDisposable接口來處理這種情況。一次性對象有一個Dispose()方法,您可以調用它來釋放它們擁有的資源。這種模式的要點是讓你重新控制你無法負擔得起非確定性清理的資源(如文件)。

而不是您的實例只是設置爲nullptr(你仍然需要做),你會首先調用Dispose方法就可以了。這個方法負責關閉你的對象擁有的所有句柄。

相關問題