2012-01-05 2 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