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. Но так как я изменил его, например, установить значение прямо из класса 1, я не видел, чтобы проблема возникла.

EDIT: Причина, по которой я думал, что она может быть исправлена, если извне «TestData» ptr = x.GetDataPtr() «вы пытаетесь установить fixed(), вы получаете« вы не можете взять адрес уже установленного выражение». .. Я получаю это сейчас, хотя это говорит о том, что мой var «ptr» в «Test()» уже исправлен.

ответ

9

Возврат из метода завершает область fixed, поэтому указатель больше не фиксируется после возврата , Безопасно передавать неподвижные указатели вверх по цепи, например.

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

Но возврат возвращает указатель нефиксированный.

Логично, это имеет смысл: нет альтернативы для CLR, чтобы решить, когда указатель должен стать нефиксированным после того, как вы вернули его из вызова.

+0

Это очень хороший момент, спасибо! (см. мой EDIT, почему я думал, что это может быть сделано) – user555265

Смежные вопросы