VC++/CLI:如何防止非托管对象在超出范围时被销毁?

VC++/CLI: How to prevent an unmanaged object from being destroyed when it goes out of scope?

我有一个第三方非托管 C++ 库,它有两个 类,我们称它们为 ClassAClassBClassA 有一个方法,我们称它为 getTheB(),它 return 是 ClassB 的一个实例 - 它不是 return 指向实例的指针,而是实例本身。

我现在为 ClassA 编写了一个托管包装器,它又具有一个方法 getTheB(),其中 return 是一个包装 ClassB.

的托管包装器

来自第三方库的原始 ClassB 对象必须通过其指针移交给我的托管包装器,例如:

ThirdParty::ClassB db = delegateForClassA -> getTheB();
ManagedClassB^ mb = gcnew ManagedClassB(&db);

但是,当我的 ClassA 包装器的 getTheB() 完成并且范围结束时,ManagedClassB 实例包含对第三方 ClassB 的悬空引用并且调用了后者的析构函数,在访问 ClassB.

的方法时导致有趣的结果

在我的另一个问题中,有人告诉我以某种方式存储原始 ClassB 对象,但我不知道如何存储。

那么,如何让第三方 ClassB 实例保持活动状态?

您应该在适合您使用的范围内分配数据库。您知道什么最适合您,无论是某物的静态成员,还是基本的全局变量,等等。只要您需要数据库,范围就必须保持有效,并且执行完成后可以超出范围。

您可以将 getTheB 更改为 return 堆分配的 ClassB,或者让 ManagedClassB 创建自己的 db 对象副本。

副本更新:

我假设 ManagedClassB 的构造函数类似于

public ref class ManagedClassB
{
public:
    ManagedClassB(ClassB* p)
        : m_p(p) { }
...
private:
    ClassB* m_p;
};

您只需将其更改为

public ref class ManagedClassB
{
public:
    ManagedClassB(const ClassB& b)
        : m_b(b) { }
...
private:
    ClassB m_b;
};

public ref class ManagedClassB
{
public:
    ManagedClassB(ClassB* p)
        : m_p(new ClassB(*p)) { }
...
private:
    ClassB* m_p;
};