Udostępnij za pośrednictwem


pin_ptr (C++/CLI)

Deklaruje Przypinanie wskaźnik, która jest używana tylko z aparatu plików wykonywalnych języka wspólnego.

Wszystkie środowiska wykonawcze

(Nie ma żadnych uwag dla tej funkcji języka, które mają zastosowanie do wszystkich programów środowiska uruchomienia.)

Środowisko wykonawcze systemu Windows

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

Środowisko uruchomieniowe języka wspólnego

A Przypinanie wskaźnik wnętrza wskaźnik, który uniemożliwia obiekt wskazaniu do przenoszenia się na stercie zebrane śmieci.Oznacza to, że wartość wskaźnika przypinania nie zostanie zmieniona przez aparat plików wykonywalnych języka.Jest to wymagane, jeśli adres klasy zarządzanej do niezarządzanego funkcja tak, że adres nie zmieni nieoczekiwanie podczas rozpoznawania wywołania funkcji niezarządzanego.

Składnia

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

Parametry

  • cv_qualifier
    constlub volatile kwalifikatorów.Domyślnie jest wskaźnik przypinania volatile.Jest zbędne, ale to nie jest błąd, aby zadeklarować wskaźnika przypinania volatile.

  • type
    Typ initializer.

  • var
    Nazwa pin_ptr zmiennej.

  • initializer
    Element członkowski typu odwołania, element tablicy lub inny obiekt, który można przypisać do wskaźniku macierzystym.

Uwagi

A pin_ptr stanowi nadzbiór funkcji wskaźniku macierzystym.W związku z tym, wszystko, co można przypisać do wskaźniku macierzystym można również przypisać do pin_ptr.Wewnętrzne wskaźnik może wykonywać ten sam zestaw operacji jako wskaźniki macierzystego, włączając porównanie i arytmetyki.

Obiekt lub zarządzanej klasy podrzędne obiektu można zakotwiczać, w którym to przypadku common language runtime nie przeniesie go podczas wyrzucania elementów bezużytecznych.Główne zastosowanie tego jest przekazać wskaźnik do danych zarządzanych jako rzeczywisty parametr wywołanie funkcji niezarządzanego.Podczas cyklu zbierania środowiska wykonawczego skontroluje stworzonymi przypinania wskaźnika i nie będzie przenoszony element wskazywany przez nią.

Przypinanie obiektu przypięcie jej wartość pola; oznacza to, że pola pierwotny lub wartość typu.Jednakże pól zadeklarowanych przez śledzenie uchwyt (%) nie są przypięte.

Przypinanie obiektu podrzędnego zdefiniowane w obiekcie zarządzanych skutkuje przypinanie cały obiekt.

Jeśli wskaźnik przypinania zostanie przypisany do punktu na nową wartość, poprzednie wystąpienie wskazał na nie jest już uważane przypiętych.

Obiekt jest przypięty tylko w czasie pin_ptr wskazuje na to.Obiekt jest już przypięty podczas jej przypinania wskaźnik znajdzie się poza zasięgiem lub jest ustawiona na nullptr.Po pin_ptr elektrotechnicznych blach teksturowanych poza zakresem, obiekt, który był przypięty mogą być przenoszone w stosie przez moduł garbage collector.Żadnych macierzystego wskazówek, które nadal wskazywać na obiekt nie zostanie zaktualizowana, a de-odwoływaniu się do jednej z nich może zgłosić wyjątek, nie do odzyskania.

Jeśli żadne wskaźniki przypinania wskaż obiekt (wszystkie wskaźniki przypinania przekroczyła zakres, zostały przypisane do wskaż inne obiekty lub zostały przypisane nullptr), obiekt nie jest zagwarantowane zostać unieruchomiony.

Wskaźnik przypinania może wskazywać do uchwytu odniesienia, typ wartości lub dojście typu prostokątnych, członkiem typu zarządzanego lub element tablicy.Nie może odnosić się do typu odwołania.

Biorąc pod adres pin_ptr że punktów macierzystego obiektu powoduje zachowanie niezdefiniowane.

Wskaźniki przypinania może zostać zadeklarowany tylko jako lokalnych zmiennych statycznych na stosie.

Wskaźniki przypinania nie można użyć jako:

  • Parametry funkcji

  • zwracany typ funkcji

  • Członek klasy

  • Typ docelowy rzutu.

pin_ptrznajduje się w cli obszaru nazw.Aby uzyskać więcej informacji, zobacz Przestrzeń nazw platformy, domyślna i cli (C++ Component Extensions).

Aby uzyskać więcej informacji o wskaźnikach wnętrza, zobacz interior_ptr (C++/CLI).

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

Wymagania

Opcja kompilatora: /clr

Przykłady

Przykład

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());
}

Dane wyjściowe

  

Przykład

Poniższy przykład pokazuje, że wewnętrzne wskaźnik mogą być konwertowane do przypinania wskaźnik, i że zwrot wpisz adres z operatorem (&) jest wnętrza wskaźnika, jeśli argument jest na stercie zarządzanych.

// 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);
};

Dane wyjściowe

1

Przykład

Poniższy przykład pokazuje, że wskaźnik przypinania mogą być rzutowane na innego typu.

// 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);
}

Dane wyjściowe

8