我最近在做一些 C++/CLI 编程,以便将我们公司的一些本机 C++ 类集成到 .NET 中。我的问题可能听起来微不足道,但这是我总是不确定的一件事:
如果有一个带有本机指针的 ref 类,说
public ref class ManagedClass {
private:
NativeClass* pObj1;
NativeClass* pObj2;
void DoStuff(NativeClass* obj);
public:
ManagedClass();
bool Activate();
}
和像这样的构造函数
ManagedClass::ManagedClass() : pObj1(new NativeClass()), pObj2(new NativeClass()) {;}
该类的实例将在托管堆上创建。但是,pObj1
是否pObj2
指向在本机堆上创建的对象?因此,即使它们是托管类的成员,使用这些指针也不需要固定?特别是,如果该DoStuff
函数调用外部本机库函数,例如
void ManagedClass::DoStuff(NativeClass* obj) {
int returnCode = External::Function(obj);
if (returnCode == 0) return true;
else return false;
}
有没有必要写诸如此类的东西pin_ptr<NativeClass> pinPtr = obj
?如果需要对指针的引用,我想情况会有所不同;但是,在这里,我知道指针本身的位置可能会因内存重新分配而有所不同,但其内容(即本机堆上的内存地址)保持有效,因为垃圾收集器不会触及该内存。这是正确的,并且上面的代码可以安全使用吗?谢谢你的帮助!
马修