我有幾個非託管的C++類互相引用。爲了避免在實例被釋放時懸掛指針,我使用boost智能指針,主要是shared_ptr。到現在爲止還挺好。懸掛在託管C++包裝的指針
不過我在C++/CLI中也有一個包裝器,其中幾乎每個非託管類都有它的託管等價物來公開給.NET應用程序。包裝很簡單,但是我不得不使用不安全的指針從ManagedClass引用UnmanagedClass *。我無法使用boost :: shared_ptr作爲ManagedClass的成員,因爲CLR不支持非託管類型作爲類成員(僅指向它們)。
示例:class Car包含4個Wheel類的實例。 5個非託管實例中的每一個都有5個託管等效實例。非託管車可能需要更換車輪,它會刪除4個非託管車輪並創建4個新車。託管汽車要求新的非託管車輪創建4個新的託管實例。
但是,Wheel的4箇舊託管實例仍處於託管環境的範圍內,現在包含指向舊的非託管實例的懸掛指針。任何想法如何認識到一個包裝的本地等價物被處置?一個簡單的任務與智能指針。我可以在託管代碼中使用它們嗎?
我已經在本地代碼中使用shared_ptr智能指針保留了一個refcount(boost正在爲我做)。當然,我不能開始計數。我的問題是,我不能在C++/cli中使用來自本地C++的boost :: shared_ptr(或者我無法弄清楚)。 CLR不支持非託管類型作爲類成員變量。你可以有一個指向NativeClass *但不是boost :: shared_ptr的指針。 –
這就是爲什麼我建議你自己實現一個引用計數機制,而不是使用boost :: shared_ptr。這樣您就可以始終從託管代碼調用Release()。 – Spook
感謝您的幫助。但是這怎麼解決懸掛指針問題呢?假設Release()從本機代碼本身(而不是託管代碼)調用,並且refCount達到零,則刪除它。本機代碼很好。但是管理的對象仍然對已刪除的本地類有一個懸而未決的引用。 –