托管类中的本机指针

Native pointers in managed class

本文关键字:本机 指针      更新时间:2023-10-16

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

马修

对于你的问题,你发布的代码是正确的,将工作。

在我看来,使用c++ CLI作为c++本地类的包装器会更好(更干净更安全),因此所有公共方法应该只接收管理对象作为参数,否则只需使用COM