VC++/CLI:如何防止非托管对象在超出范围时被销毁?
VC++/CLI: How to prevent an unmanaged object from being destroyed when it goes out of scope?
我有一个第三方非托管 C++ 库,它有两个 类,我们称它们为 ClassA
和 ClassB
。 ClassA
有一个方法,我们称它为 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;
};
我有一个第三方非托管 C++ 库,它有两个 类,我们称它们为 ClassA
和 ClassB
。 ClassA
有一个方法,我们称它为 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;
};