這裏是我的情況:檢查.NET手柄的價值^
我有一個C++/CLI層持有指向非託管C++對象.NET包裝的對象。我已經實現了終結器,以便它刪除garbage-collection上包裝器對象指向的非託管內存,並將指針設置爲null。
這裏的問題:
我留意.NET包裝對象的終結,它被調用兩次,並嘗試刪除同一內存的兩倍,這說明我已經莫名其妙地創建2 .NET包裝器對象超出了範圍,並且在我仍然期望包裝器對象處於作用域(這些包裝器對象正在傳遞給VB.NET應用程序)的同時被垃圾收集。
我的問題是:
反正對我來說,檢查句柄值,這樣我可以確認,其中越來越創建(複製或其他)的包裝對象?目前我正在查看句柄值(EG - 0x0014fe80),但在創建對象,添加到集合和刪除時,我會看到3個不同的值。所以我不確定GC是否只是移動東西,這是同一個對象,或者如果我真的看到3個不同的對象引用相同的非託管內存。如果可能的話,我想解析重複的對象副本,但是我明白我可能會想要實現某種智能指針,這樣就不會發生。
感謝, 伊恩
不,這會被垃圾收集器更新,因爲它會壓縮堆。跟蹤對象的一種簡單方法是在構造函數中給它們一個數字。理想的情況下,本地指針值足夠:) –
好了,但如果我有這樣的事情: '公用Sub handle_obj_callback(Wrap_Class^OBJ)'' = dat_member obj' '結束Sub' 我從來不叫也就是dat_member上的構造函數,但它與參數類型相同,所以我只是設置它。然後我有兩個.NET對象指向相同的非託管內存,對,所以我無法區分它們? – Ian
對不起,這很糟糕,我不知道如何在這些評論中發佈代碼。但基本上,我有一個VB.NET類與成員,我永遠不會調用構造函數。我用它做的所有事情都將其設置爲從C++/CLI庫傳遞給我的對象的值。所以我最終得到了2個引用同一個非託管內存的.NET對象。 – Ian