Поделиться через


__pin

Примечание.   Этот раздел применим только к версии 1 управляемых расширений для C++. Этот синтаксис должен использоваться только для поддержания Кода версии 1. См. pin_ptr дополнительные сведения об использовании эквивалентным функциям в новом синтаксисе.

Предотвращает объект или внедренный объект управляемого класса из перемещения средой CLR во время сборки мусора.

__pin identifier

Заметки

__pin ключевое слово объявляет указатель на объект или внедренный объект управляемого класса и предотвращает, что объект из перемещается во время сборки мусора средой CLR. Это полезно при передаче адреса управляемого класса в неуправляемую функцию, поскольку адрес не изменится неожиданно во время разрешения вызова неуправляемой функции.

Закрепляющий указатель остается допустимым в своей лексической области. Как только закрепляющий указатель выходит из области, объект больше не считается закреплено (если, конечно, не имеется существуют другие закрепляющего указатели, указывающий или в объект).

MSIL, отсутствует понятие "области блока" -- все локальные переменные находятся в области функции. Позволить системе знать закрепление больше не фактически компилятор создает код, присвоити закрепляющий указатель на АННУЛИРУЮТ. Это также которого необходимо самостоятельно выполнять, если нужно открепить объект без оставить блок.

Не следует преобразовать в закрепляющий указатель на неуправляемый указатель и продолжить использовать этот неуправляемый указатель после того, как объект более не закреплен (после закрепляющий указатель выходит из области). В отличие от указателей gc, закрепление указателей могут быть преобразованы в nogc, неуправляемым указателям. Однако пользователь должен поддерживать закрепить, когда неуправляемый указатель.

Использование закрепленный указатель для получения адреса переменной, а затем использовать этот адрес после создания закрепляющий указатель выходит из области, быть выполнено.

// keyword_pin_scope_bad.cpp
// compile with: /clr:oldSyntax /LD
#using <mscorlib.dll>
__gc struct X {
   int x;
};
 
int* Get_x( X* pX ) {
   int __pin* px = &pX -> x;
   return px;   // BE CAREFUL px goes of scope, 
                // so object pointed by it is no longer pinned,
                // making the return value unsafe.
}

В следующем образце показано правильное поведение:

// keyword_pin_scope_good.cpp
// compile with: /clr:oldSyntax /LD
#using <mscorlib.dll>
__gc struct X {
   int x;
};
 
int Get_x( X* pX ) {
   int __pin* px = &pX -> x;
   return *px;   // OK, value obtained from px before px out of scope
}

Пример

В следующем примере объект указал к которым следуют pG закрепит до тех пор, пока он не будет передачи из области:

// keyword__pin.cpp
// compile with: /clr:oldSyntax
#using <mscorlib.dll>
#include <iostream>

__gc class G { 
public: 
   int i; 
   G() {i = 0;};
};

class H {
public:
   // unmanaged function
   void incr(int * i) {
      (*i)++; 
      std::cout << *i << std::endl;
   };
};

int main() {
   G __pin * pG = new G;  // pG is a pinning pointer
   H * h = new H;
   // pointer to managed data passed as actual parameter of unmanaged 
   // function call
   h->incr(& pG -> i); 
}

Output

1