我想弄清楚如何正確地清理我的對象在C++/CLI後。我該如何編寫適當的析構函數和終結器?
我已閱讀或脫脂這兩篇文章(one,two)看着the standard,看着其他一些問題,特別是this one。
我有各種信息:
- 終結應清理非託管資源(所以一切都被清理當對象被垃圾回收
- 析構函數應該清理託管資源(刪除FOO或Foo.Dispose()?),並調用(根據1)
- 兩種析構函數終結器和終結器可以被多次調用(參見8.8.8的3第26頁端)
- 如果析構被稱爲終結器將不會被調用(根據1)(不是由CLR,也就是說,你仍然可以自己調用它)
- 析構函數將調用基類析構函數(請參閱3 p。 25)
- 有一個終結應該始終有一個析構函數的類(大概是爲了明確地清理非託管資源)
- 到終結,呼叫不會調用基類的終結(3 19.13.2第131頁)
但也有引起部分許多混亂的事實,
- 終結被稱爲析構函數在C#
- 析構函數內部生成Dispos e和finalize方法(不知道的Finalize),但Finalize方法不是終結
- 析構函數的語義是在C++ 不同和具有一般
我想作爲一個答案是一個類的例子,它可能包含所有不同類型的數據(託管,非託管,託管但是一次性的,任何你能想到的)以及正確書寫的析構函數和終結器。
我有兩個更具體的問題:
- 難道是接受處理的通過只是有一個
bool hasBeenCleanedUp
成員,使整個代碼在析構函數/終結條件上被多次調用的可能性? - 什麼樣的數據只能由析構函數清理,但不能在終結器中清理,因爲它可能已被gc清除了?
如果*你*給出了不同種類的數據的例子,並告訴我們你的嘗試,那麼你會得到更好的迴應,然後我們可以給出反饋。 –