2011-10-03 47 views
1

這裏是我的情況:檢查.NET手柄的價值^

我有一個C++/CLI層持有指向非託管C++對象.NET包裝的對象。我已經實現了終結器,以便它刪除garbage-collection上包裝器對象指向的非託管內存,並將指針設置爲null。

這裏的問題

我留意.NET包裝對象的終結,它被調用兩次,並嘗試刪除同一內存的兩倍,這說明我已經莫名其妙地創建2 .NET包裝器對象超出了範圍,並且在我仍然期望包裝器對象處於作用域(這些包裝器對象正在傳遞給VB.NET應用程序)的同時被垃圾收集。

我的問題是:

反正對我來說,檢查句柄值,這樣我可以確認,其中越來越創建(複製或其他)的包裝對象?目前我正在查看句柄值(EG - 0x0014fe80),但在創建對象,添加到集合和刪除時,我會看到3個不同的值。所以我不確定GC是否只是移動東西,這是同一個對象,或者如果我真的看到3個不同的對象引用相同的非託管內存。如果可能的話,我想解析重複的對象副本,但是我明白我可能會想要實現某種智能指針,這樣就不會發生。

感謝, 伊恩

+0

不,這會被垃圾收集器更新,因爲它會壓縮堆。跟蹤對象的一種簡單方法是在構造函數中給它們一個數字。理想的情況下,本地指針值足夠:) –

+0

好了,但如果我有這樣的事情: '公用Sub handle_obj_callback(Wrap_Class^OBJ)'' = dat_member obj' '結束Sub' 我從來不叫也就是dat_member上的構造函數,但它與參數類型相同,所以我只是設置它。然後我有兩個.NET對象指向相同的非託管內存,對,所以我無法區分它們? – Ian

+0

對不起,這很糟糕,我不知道如何在這些評論中發佈代碼。但基本上,我有一個VB.NET類與成員,我永遠不會調用構造函數。我用它做的所有事情都將其設置爲從C++/CLI庫傳遞給我的對象的值。所以我最終得到了2個引用同一個非託管內存的.NET對象。 – Ian

回答

1

看看this question
Herescoped_ptr是不可複製,並具有非託管對象的自動釋放機制的實現,通過@Ben福格特

0

呀,我最終修改了一個auto_ptr類作爲共享指針,以確保非託管內存只能通過智能指針終結器刪除一次。我假設我做了類似於所有其他實現的東西;我在auto_ptr模板類中創建了一個靜態字典,使用本地指針值作爲鍵,每次調用終結器來更新每個項目的計數或刪除內存時,都會檢查它。