【发布时间】:2015-07-25 20:33:30
【问题描述】:
我有一个第三方非托管 C++ 库,它有两个类,我们称它们为 ClassA 和 ClassB。 ClassA 有一个方法,我们称之为getTheB(),它返回一个ClassB 的实例——它不返回指向该实例的指针,而是返回实例本身。
我现在为ClassA 编写了一个托管包装器,它又具有一个方法getTheB(),它返回一个包装ClassB 的托管包装器。
来自第三方库的原始ClassB 对象必须通过它的指针交给我的托管包装器,例如:
ThirdParty::ClassB db = delegateForClassA -> getTheB();
ManagedClassB^ mb = gcnew ManagedClassB(&db);
但是,当我的 ClassA 包装器的包装器 getTheB() 完成并且范围结束时,ManagedClassB 实例包含对第三方 ClassB 的悬空引用,并调用后者的析构函数,访问ClassB 的方法时导致有趣的结果。
在我的另一个问题中,有人告诉我以某种方式存储原始 ClassB 对象,但我不知道如何。
那么,如何让第三方ClassB 实例保持活动状态?
【问题讨论】:
-
如果这个类有一个复制构造函数,你可以像 new ClassB(delegate->getTheB()) 一样实例化它,或者如果它有一个赋值运算符,你可以将它分配给新对象。您也可以创建一个包装类,将实例作为参考传递,例如: class Wrapper { public: Wrapper(ClassB& ref) : _ref(ref) {} private: ClassB& _ref;然后你用 new Wrapper(delegate->getTheB()); 实例化它如果可以这样说,那么它就在包装对象的范围内。
-
第三方
ClassB没有可见的公共构造函数,实例仅由库中其他类的方法返回。使用第二种方法,_ref来自哪里?它是 VC++ 的“内置”还是库中的? -
不,是变量名。实际上我不知道它是否真的是在包装器范围内创建的,或者它是一个悬空引用。
标签: .net visual-c++ c++-cli interop