我有几个相互引用的非托管 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 个旧托管实例仍在托管世界的范围内,现在包含一个指向旧非托管实例的悬空指针。任何想法如何实现包装器的本机等价物已被处置?使用智能指针轻松完成任务。我可以在托管代码中使用它们吗?