pin_ptr (C++/CLI)

Deklaruje wskaźnik przypinania, który jest używany tylko w środowisku uruchomieniowym języka wspólnego.

Wszystkie środowiska wykonawcze

(Nie ma żadnych uwag dotyczących tej funkcji językowej, która ma zastosowanie do wszystkich środowisk uruchomieniowych).

Środowisko wykonawcze systemu Windows

(Ta funkcja języka nie jest obsługiwana w środowisko wykonawcze systemu Windows).

środowiska uruchomieniowe w trakcie wykonania

Wskaźnik przypinania jest wewnętrznym wskaźnikiem, który uniemożliwia obiektowi przejście na stertę zbieraną przez śmieci. Oznacza to, że wartość wskaźnika przypinania nie jest zmieniana przez środowisko uruchomieniowe języka wspólnego. Jest to wymagane w przypadku przekazania adresu klasy zarządzanej do funkcji niezarządzanej, aby adres nie zmienił się nieoczekiwanie podczas rozpoznawania niezarządzanego wywołania funkcji.

Składnia

[cli::]pin_ptr<cv_qualifiertype>var = &initializer;

Parametry

cv_qualifier
const lub volatile kwalifikatory. Domyślnie wskaźnik przypinania to volatile. Jest on nadmiarowy, ale nie jest błędem deklarowania wskaźnika volatileprzypinania .

type
Typ inicjatora.

var
Nazwa zmiennej pin_ptr .

Inicjatora
Element członkowski typu odwołania, element tablicy zarządzanej lub dowolny inny obiekt, który można przypisać do natywnego wskaźnika.

Uwagi

Pin_ptr reprezentuje nadzbiór funkcji natywnego wskaźnika. W związku z tym wszystkie elementy, które można przypisać do natywnego wskaźnika, można również przypisać do pin_ptr. Wskaźnik wewnętrzny może wykonywać ten sam zestaw operacji co wskaźniki natywne, w tym arytmetyka porównania i wskaźnika.

Obiekt lub obiekt podrzędny klasy zarządzanej można przypiąć, w tym przypadku środowisko uruchomieniowe języka wspólnego nie przeniesie go podczas odzyskiwania pamięci. Głównym zastosowaniem tej funkcji jest przekazanie wskaźnika do zarządzanych danych jako rzeczywistego parametru niezarządzanego wywołania funkcji. Podczas cyklu zbierania środowisko uruchomieniowe sprawdzi metadane utworzone dla wskaźnika przypinania i nie przeniesie elementu, do którym wskazuje.

Przypinanie obiektu również przypina pola jego wartości; czyli pola typu pierwotnego lub wartości. Jednak pola zadeklarowane przez uchwyt śledzenia (%) nie są przypięte.

Przypinanie obiektu podrzędnego zdefiniowanego w obiekcie zarządzanym ma wpływ na przypinanie całego obiektu.

Jeśli wskaźnik przypinania zostanie ponownie przydzielony, aby wskazać nową wartość, poprzednie wystąpienie wskazujące nie jest już uznawane za przypięte.

Obiekt jest przypięty tylko wtedy, gdy pin_ptr wskazuje go. Obiekt nie jest już przypięty, gdy jego wskaźnik przypinania wykracza poza zakres lub jest ustawiony na nullptr. Po zakończeniu pin_ptr poza zakresem obiekt przypięty może zostać przeniesiony do sterty przez moduł odśmiecania pamięci. Wszystkie natywne wskaźniki, które nadal wskazują obiekt, nie zostaną zaktualizowane, a odwołanie do jednego z nich może wywołać nieodwracalny wyjątek.

Jeśli żadne przypinanie wskaźników wskazuje obiekt (wszystkie wskaźniki przypinania wyszły z zakresu, zostały ponownie przypisane do punktu do innych obiektów lub zostały przypisane nullptr), obiekt nie ma gwarancji, że nie zostanie przypięty.

Wskaźnik przypinania może wskazywać uchwyt odwołania, typ wartości lub uchwyt typu skrzynkowego, element członkowski typu zarządzanego lub element tablicy zarządzanej. Nie może wskazywać typu odwołania.

Biorąc adres pin_ptr , który wskazuje na obiekt macierzysty powoduje niezdefiniowane zachowanie.

Przypinanie wskaźników można zadeklarować tylko jako niestatyczne zmienne lokalne na stosie.

Nie można użyć wskaźników przypinania jako:

  • parametry funkcji

  • zwracany typ funkcji

  • składowa klasy

  • typ docelowy rzutowania.

pin_ptr znajduje się w cli przestrzeni nazw. Aby uzyskać więcej informacji, zobacz Platform, default i cli Namespaces (Przestrzenie nazw platformy, ustawień domyślnych i interfejsu wiersza polecenia).

Aby uzyskać więcej informacji na temat wskaźników wewnętrznych, zobacz interior_ptr (C++/CLI).

Aby uzyskać więcej informacji na temat przypinania wskaźników, zobacz Instrukcje: przypinanie wskaźników i tablic oraz Instrukcje: deklarowanie wskaźników przypinania i typów wartości.

Wymagania

Opcja kompilatora: /clr

Przykłady

W poniższym przykładzie użyto pin_ptr , aby ograniczyć położenie pierwszego elementu tablicy.

// pin_ptr_1.cpp
// compile with: /clr
using namespace System;
#define SIZE 10

#pragma unmanaged
// native function that initializes an array
void native_function(int* p) {
   for(int i = 0 ; i < 10 ; i++)
    p[i] = i;
}
#pragma managed

public ref class A {
private:
   array<int>^ arr;   // CLR integer array

public:
   A() {
      arr = gcnew array<int>(SIZE);
   }

   void load() {
   pin_ptr<int> p = &arr[0];   // pin pointer to first element in arr
   int* np = p;   // pointer to the first element in arr
   native_function(np);   // pass pointer to native function
   }

   int sum() {
      int total = 0;
      for (int i = 0 ; i < SIZE ; i++)
         total += arr[i];
      return total;
   }
};

int main() {
   A^ a = gcnew A;
   a->load();   // initialize managed array using the native function
   Console::WriteLine(a->sum());
}
45

W poniższym przykładzie pokazano, że wskaźnik wewnętrzny można przekonwertować na wskaźnik przypinania i że zwracany typ operatora adresu (&) jest wskaźnikiem wewnętrznym, gdy operand znajduje się na zarządzanej stercie.

// pin_ptr_2.cpp
// compile with: /clr
using namespace System;

ref struct G {
   G() : i(1) {}
   int i;
};

ref struct H {
   H() : j(2) {}
   int j;
};

int main() {
   G ^ g = gcnew G;   // g is a whole reference object pointer
   H ^ h = gcnew H;

   interior_ptr<int> l = &(g->i);   // l is interior pointer

   pin_ptr<int> k = &(h->j);   // k is a pinning interior pointer

   k = l;   // ok
   Console::WriteLine(*k);
};
1

W poniższym przykładzie pokazano, że wskaźnik przypinania można rzutować na inny typ.

// pin_ptr_3.cpp
// compile with: /clr
using namespace System;

ref class ManagedType {
public:
   int i;
};

int main() {
   ManagedType ^mt = gcnew ManagedType;
   pin_ptr<int> pt = &mt->i;
   *pt = 8;
   Console::WriteLine(mt->i);

   char *pc = ( char* ) pt;
   *pc = 255;
   Console::WriteLine(mt->i);
}
8
255