托管类中的本机指针

时间:2013-06-05 07:15:17

标签: c++ .net memory-management c++-cli

我最近正在做一些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()) {;}

将在托管堆上创建该类的实例。但是,pObj1pObj2是否指向在本机堆上创建的对象?因此,即使因为它们是托管类的成员,也不需要使用这些指针。特别是,如果DoStuff函数调用外部本机库函数,请说

void ManagedClass::DoStuff(NativeClass* obj) {  
    int returnCode = External::Function(obj);  
    if (returnCode == 0) return true;  
    else return false;  
}

是否不需要写pin_ptr<NativeClass> pinPtr = obj等内容?我想如果需要指针的引用,情况会有所不同;但是,我知道指针本身的位置可能因内存重新分配而有所不同,但其内容(即本机堆上的内存地址)保持有效,因为垃圾收集器不会触及该内存。这是正确的,像上面的代码安全使用? 谢谢你的帮助!

马修

1 个答案:

答案 0 :(得分:1)

对于您的问题,您发布的代码是正确无误的。

在我看来,最好(更清洁\更安全)使用C ++ \ CLI作为C ++本机类的包装器,这样所有公共方法都应该只接收托管对象作为参数,否则只需使用COM

相关问题