2012-01-05 45 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()」您嘗試將固定的(),你會得到「你不能把一個已經固定的地址表達」。 ..我現在得到它雖然它正在說我的變種「PTR」在「測試()」已被固定..

回答

9

從該方法返回結束fixed範圍,因此指針不再固定,一旦你返回。將固定指針傳遞到鏈上是安全的,例如,

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

但是返回使指針不再固定。

從邏輯上講,這是有道理的:CLR沒有別的辦法來決定指針在從通話中返回後何時變得不固定。

+0

這是一個很好的觀點,謝謝! (請參閱我的編輯,爲什麼我認爲它可能會這樣做) – user555265 2012-01-05 14:34:15