interior_ptr pin_ptr的问题

时间:2012-12-21 17:42:39

标签: pointers c++-cli pin-ptr

我正在尝试构建一个cli / c ++ ref类。此类的目的是使用某些功能包装本机类指针。通过黑盒工厂方法向我提供本机类指针。对于我的生活,我无法弄清楚如何固定本机指针,使其不移动。这是代码中的场景(可以这么说):

public ref class ManagedFoo{
    private: 
        NativeFooClass* myFoo;
    public:
        ManagedFoo(){
            NativeFooFactory factory();
            NativeFooClass* nativePtr = factory.CreateFoo();
            //here is where i get lost 
            //create a pined pointer to the nativePtr
            pin_ptr<NativeFooClass*> pinPtr = &nativePtr;
            //tring to assign pinPtr to the mamaber var= compilation faliuer 
            myFoo = pinPtr;
        }
}

我一直在: 错误C2440:'=':无法从'cli :: pin_ptr'转换为'NativeFooClass *'

我认为编译器对待它们是一样的吗?我需要静态演员吗?那似乎不对???

我试图固定这个指针的原因是因为当我尝试在方法中使用它,然后从C#调用此方法时,我得到一个AccessViolation运行时错误“{”试图读取或写入受保护的内存。这通常表明其他内存已损坏。“}”

1 个答案:

答案 0 :(得分:2)

你不需要。本机对象存储在不由.NET垃圾收集器管理的内存中 - 它们不会被移动,并且固定不起作用。

简单地

    ManagedFoo()
    {
        NativeFooFactory factory; // fixed most-vexing parse
        myFoo = factory.CreateFoo();
    }

应该足够了。

甚至更好

    ManagedFoo()
        : myFoo{NativeFooFactory().CreateFoo()}
    {
    }

更新:由于我们发现对象不能超过其工厂,

    ManagedFoo()
        : myFooFactory{new NativeFooFactory()}
        , myFoo{myFooFactory->CreateFoo()}
    {
    }

虽然我建议使用某种智能指针来确保正确释放本机对象,但也许我的clr_scoped_ptr