Sdílet prostřednictvím


pin_ptr (C++/CLI)

Prohlašuje přídavný ukazatel, který se používá pouze společného jazykového modulu runtime.

Všechny moduly runtime

(Neexistují žádné poznámky k této funkci jazyka platící pro všechny moduly runtime.)

Prostředí Windows Runtime

(Tuto funkci jazyka není podporováno v systému Windows za běhu.)

Common Language Runtime

A přídavný ukazatel je vnitřní ukazatel, který brání objekt odkazuje v přechodu na haldě uvolňování paměti.To znamená není změněna hodnota přídavného ukazatele podle společného jazykového modulu runtime.To je nutné při předat adresu spravované třídy do nespravované funkce, takže adresa nezmění neočekávaně během volání funkce nespravovaného řešení.

Syntax

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

Parametry

  • cv_qualifier
    constnebo volatile kvalifikátory.Standardně je přídavný ukazatel volatile.Je nadbytečné, ale nejde o chybu deklarovat přídavný ukazatel volatile.

  • type
    Typ initializer.

  • var
    Název pin_ptr proměnné.

  • initializer
    Člen typ odkazu, prvek spravovaného pole nebo jiný objekt je možné přiřadit nativní ukazatele.

Poznámky

A pin_ptr představuje nadmnožinu přepínače funkce nativní ukazatele.Proto cokoli, co může být přiřazen k nativní ukazatele lze také přiřadit pin_ptr.Vnitřní ukazatel je oprávněn provádět stejnou sadu operací jako nativní ukazatele, včetně porovnání a aritmetika ukazatele.

Objektu nebo podobjektu spravované třídy, lze připojit, v tomto případě společného jazykového modulu runtime se přesunout během uvolňování paměti.Hlavní použití je pro předání ukazatele spravovaná data jako skutečný parametr volání nespravované funkce.Během cyklu kolekce modul runtime bude kontrolovat metadata pro přídavný ukazatel a nepřesune odkazuje na požadovanou položku.

Odkazování na objekt také PinY její hodnotu pole; To znamená zadejte hodnotu nebo pole Základní.Však pole prohlášena za sledovací popisovač (%) nejsou drženy.

Připnutí dílčí objekt definovaný v spravovaného objektu má za následek odkazování celého objektu.

Pokud znovu přiřadit přídavný ukazatel přejděte na položku Nová hodnota předchozí instance odkazoval se již nepovažuje za držení.

Objekt je označen pouze při pin_ptr na ně odkazuje.Objekt umístěn již při jeho přídavný ukazatel mimo rozsah nebo je nastavena na nullptr.Po pin_ptr přejde mimo rozsah objektu, který byl v držení lze používat v haldě uvolňování paměti.Všechny nativní ukazatele, které i nadále odkazovat na objekt nebude aktualizován a zrušit odkazy na jeden z nich by mohly vyvolat neobnovitelné výjimce.

Pokud žádný přídavný ukazatel umístěte ukazatel na objekt (všechny přídavného ukazatele byla mimo rozsah, byly znovu přejděte na další objekty nebo byly přiřazeny nullptr), objekt je zaručena být drženy.

Přídavný ukazatel může odkazovat odkaz úchyt, typ hodnoty nebo zabalený typ popisovače, typ spravovaného člena nebo prvek spravovaného pole.Nemůže odkazovat na typ odkazu.

Převzetím adresy pin_ptr , že odkazuje na nativní objekt způsobí nedefinované chování.

Přídavného ukazatele lze deklarovat pouze jako nestatické lokální proměnné v zásobníku.

Přídavného ukazatele nelze použít jako:

  • parametry funkce

  • Návratový typ funkce

  • člen třídy

  • cílový typ přetypování.

pin_ptrv cli obor názvů.Další informace naleznete v tématu Obory názvů Platform, default a cli (rozšíření komponent C++).

Další informace o vnitřní ukazatele v interior_ptr (C++/CLI).

Další informace o připnutých ukazatelů v Postupy: Připnutí ukazatelů a polí a Postupy: Deklarace přídavných ukazatelů a typů hodnot.

Požadavky

Možnost kompilátoru: /clr

Příklady

Příklad

Následující příklad používá pin_ptr Chcete-li omezit pozici prvního prvku matice.

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

Výsledek

  

Příklad

Následující příklad ukazuje, že vnitřní ukazatel může být převedena na přídavný ukazatel a návrat zadejte operátor adresu z (&) je vnitřním ukazatelem, pokud operand na spravované haldě.

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

Výsledek

1

Příklad

Následující příklad ukazuje, že přídavný ukazatel může být převeden do jiného 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);
}

Výsledek

8