我有几个相互引用的非托管c ++类。为了避免在发布实例时悬空指针,我使用的是boost智能指针,主要是shared_ptr。到目前为止一切都很好。
但是我在C ++ / CLI中也有一个包装器,其中几乎每个非托管类都有其托管等效项,以将其公开给.NET应用程序。包装器非常简单,但是我被迫使用一个不安全的指针来引用ManagedClass中的UnmanagedClass *。我不能将boost :: shared_ptr用作ManagedClass的成员,因为CLR不支持非托管类型作为类成员(仅指向它们的指针)。
示例:类Car包含4个类Wheel实例。 5个非托管实例中的每个实例都有5个托管等效实例。非托管汽车可能需要更换其车轮,它会删除4个非托管车轮实例并创建4个新实例。 Managed Car要求新的非托管Wheel创建4个新的托管实例。
但是,Wheel的4个旧托管实例仍然在托管世界的范围内,现在包含指向旧的非托管实例的悬空指针。任何想法如何实现包装的原生等价物被处置?使用智能指针轻松完成任务。我可以在托管代码中使用它们吗?
答案 0 :(得分: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中调用一次。