-1

我有几个相互引用的非托管 c++ 类。为了避免在释放实例时出现悬空指针,我使用了 boost 智能指针,主要是 shared_ptr。到现在为止还挺好。

但是,我在 C++/CLI 中也有一个包装器,其中几乎每个非托管类都有其托管等效项,以将其公开给 .NET 应用程序。包装器非常简单,但是我被迫使用不安全的指针从 ManagedClass 中引用 UnmanagedClass*。我不能将 boost::shared_ptr 用作 ManagedClass 的成员,因为 CLR 不支持将非托管类型作为类成员(仅指向它们的指针)。

示例:包含 4 个 Wheel 类实例的 Car 类。5 个非托管实例中的每一个都有 5 个托管等效实例。Unmanaged Car 可能需要更换它的轮子,它会删除 4 个 unmanaged Wheel 实例并创建 4 个新实例。Managed Car 要求新的非托管 Wheel 创建 4 个新的 Wheel 托管实例。

但是,Wheel 的 4 个旧托管实例仍在托管世界的范围内,现在包含一个指向旧非托管实例的悬空指针。任何想法如何实现包装器的本机等价物已被处置?使用智能指针轻松完成任务。我可以在托管代码中使用它们吗?

4

1 回答 1

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 中调用一次 Release。

于 2012-11-21T12:04:05.483 回答