0

我正在尝试构建一个 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 运行时错误“{”试图读取或写入受保护的内存。这通常表明其他内存已损坏。"}"

4

1 回答 1

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.

于 2012-12-21T17:50:55.107 回答