2012-01-05 13 views
3

固定ポインタをあるメソッドから別のメソッドに戻すのが安全かどうか、固定されたオブジェクトはまだ固定されていますか?例えばCで固定ポインタを返す

struct TestData 
{ 
    public int value; 
} 

public class Class1 
{ 
    private TestData data; 

    public unsafe TestData* GetDataPtr() 
    { 
     fixed (TestData* ptr = &data) 
     { 
      // IS THIS SAFE? 
      return ptr; 
     } 
    } 
} 

public class Class2 
{ 
    public unsafe void Test() 
    { 
     Class1 x = new Class1(); 

     TestData* ptr = x.GetDataPtr(); // is this still fixed? 
     ptr->value = 2; 
    } 
} 

私が求めている理由は、私はAccessViolationの例外を取得してきたこのスタイルで何かを使用しています。しかし、私はそれを以下のように変更しました。 Class1から直接値を設定私は問題が発生して見ていない。

編集: 「TestData * ptr = x.GetDataPtr()」の外側に固定()を入れようとすると「固定されている可能性があります表現 "と呼ばれる。 "Test()"内の私のvar "ptr"について既に話していますが、今すぐ取得します。

答えて

9

fixedの範囲を終了するので、ポインタは固定されなくなります。 。チェーンの上に固定ポインタを渡すことは安全です。

fixed(TestData* ptr = &data) { 
    MyFunction1(ptr); 
    MyFunction2(ptr); 
} 

しかし、戻るとポインタは再び固定されません。

これは理にかなっています。コールから返された後にポインタが固定されないようにする方法をCLRが決定する方法はありません。

+0

非常に良い点です。ありがとうございます! (なぜ私はそれを行うかもしれないと思った私の編集を参照してください) – user555265

関連する問題