2012-11-21 69 views
-1

我有幾個非託管的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箇舊託管實例仍處於託管環境的範圍內,現在包含指向舊的非託管實例的懸掛指針。任何想法如何認識到一個包裝的本地等價物被處置?一個簡單的任務與智能指針。我可以在託管代碼中使用它們嗎?

回答

0

爲什麼不使用內部實例計數?創建一個基本機類:

class Base 
{ 
    int refCount = 0; 

public: 
    void AddRef() { refCount++; } 
    void Release() { refCount--; if (refCount == 0) delete this; } 
} 

然後用它作爲所有這些的基類,並記住調用的AddRef,當你獲得類和Release(實例),當你不再需要它(例如,在析構函數)。您必須在您的C++/CLI類中執行相同的操作;實現一個IDisposable接口並在Dispose()方法中清除保存的本地類實例。使用它不應該有太大問題,因爲你只需要在構造函數中調用AddRef,並且在析構函數/ Dispose中調用一次。

+0

我已經在本地代碼中使用shared_ptr智能指針保留了一個refcount(boost正在爲我做)。當然,我不能開始計數。我的問題是,我不能在C++/cli中使用來自本地C++的boost :: shared_ptr(或者我無法弄清楚)。 CLR不支持非託管類型作爲類成員變量。你可以有一個指向NativeClass *但不是boost :: shared_ptr 的指針。 –

+0

這就是爲什麼我建議你自己實現一個引用計數機制,而不是使用boost :: shared_ptr。這樣您就可以始終從託管代碼調用Release()。 – Spook

+0

感謝您的幫助。但是這怎麼解決懸掛指針問題呢?假設Release()從本機代碼本身(而不是託管代碼)調用,並且refCount達到零,則刪除它。本機代碼很好。但是管理的對象仍然對已刪除的本地類有一個懸而未決的引用。 –