2011-05-24 15 views
0

我有一個unmanged類和其中Ar邏輯連接一個引用類:C++/CLI引用類沒有得到釋放

public ref class RefBlah 
{ 
    ~RefBlah(); 
    !RefBlah(); 

    internal: 

    UnManagedBlah* m_unmanaged; 
} 

public class UnManagedBlah 
{ 
    public: 
    gcroot<RefBlah^> refBlah; 
} 

RefBlah類總是創建的UnManagedBlah一個實例,其保持到參考創建它的對象。

現在,當我在C#應用程序中創建一個RefBlah的實例時,它在超出作用域時不會被釋放。 (我等待並看到所有其他對象被釋放,但它拒絕移除它自己)。

據我所知,如果它們都是常規的.Net對象,它們都會在類超出範圍時收集,因爲雖然引用計數不會達到0.而這是因爲沒有引用根來自主堆棧的對象。

.NET GC是否以不同方式處理來自非託管類的引用?

我該如何更改設計,以便RefBlah將被銷燬?

回答

3

我認爲你有一個循環引用問題。 RefBlah如果你需要有非託管類中的引用,那麼也許它應該不會得到GC'd直到UnManagedBlah被GC'd參考,當你在RefBlah等刪除指針,只會發生..

是一個弱的參考?看看在GCHandle結構:

的的GCHandle類用於與 GCHandleType枚舉創建對應於任何一個 手柄管理 對象。此句柄可以是四個 類型之一:弱,弱跟蹤重置, 正常或固定。當處理程序已分配 時,可以使用它到 防止非託管客戶端持有 唯一引用時由垃圾回收器 收集的管理對象爲 。沒有這樣的句柄, 該對象可以由 垃圾收集器收集,然後完成 其代表非託管 客戶端的工作。

+0

不錯,不知道你可以在C#中創建一個弱引用。有道理,他們會擁有它:) – 2011-05-24 08:42:11

+0

循環引用不會影響.Net儘可能多。問題在於,因爲** UnManagedBlah **是非託管的,所以CLI在未經管理的代碼中引用它時不釋放引用的對象。但解決方案無論如何解決了這個問題。 – 2011-05-24 10:14:08