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 ランタイム エラー "{"Attempted to read or write protected memory. これは多くの場合、他のメモリが破損していることを示しています。"}"

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 に答える