2

我最近在做一些 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?如果需要对指针的引用,我想情况会有所不同;但是,在这里,我知道指针本身的位置可能会因内存重新分配而有所不同,但其内容(即本机堆上的内存地址)保持有效,因为垃圾收集器不会触及该内存。这是正确的,并且上面的代码可以安全使用吗?谢谢你的帮助!

马修

4

1 回答 1

1

对于您的问题,您发布的代码是正确的并且可以正常工作。

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

于 2013-06-05T07:41:25.097 回答