我最近正在做一些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
等内容?我想如果需要指针的引用,情况会有所不同;但是,我知道指针本身的位置可能因内存重新分配而有所不同,但其内容(即本机堆上的内存地址)保持有效,因为垃圾收集器不会触及该内存。这是正确的,像上面的代码安全使用?
谢谢你的帮助!
马修
答案 0 :(得分:1)
对于您的问题,您发布的代码是正确无误的。
在我看来,最好(更清洁\更安全)使用C ++ \ CLI作为C ++本机类的包装器,这样所有公共方法都应该只接收托管对象作为参数,否则只需使用COM