Sdílet prostřednictvím


__pin

 

Publikováno: duben 2016

Poznámka   Toto téma se týká pouze verze 1 spravovaných rozšíření jazyka C++. Tato syntaxe by měla sloužit pouze k udržování kódu verze 1. Viz pin_ptr (C++/CLI) informace o použití ekvivalentní funkce v nové syntaxi.

Zabraňuje objektu nebo vloženého objektu spravované třídy přesunutí modulem common language runtime během uvolňování paměti.

Syntaxe

__pin 
identifier

Poznámky

__pin Klíčové slovo deklaruje ukazatel na objekt nebo vložený objekt spravované třídy a zabraňuje přesunutí během uvolňování paměti modulem common language runtime tohoto objektu. To je užitečné, když předáním adresy spravované třídy do nespravované funkce, protože adresa nezmění neočekávaně během rozlišení nespravovaná funkce volání.

Přídavných ukazatel zůstane v jeho oboru lexikální platná. Jakmile přídavných ukazatel dostane mimo rozsah, objekt již považován za připnuté (pokud existují samozřejmě jiných přídavných ukazatelů, přejdete na nebo do objektu).

Jazyk MSIL nemá žádný koncept "rozsahem bloku"--live všechny lokální proměnné v oboru funkce. Pokud chcete, aby systém vědět, že že přídavné již není v platnosti, kompilátor vygeneruje kód, který přiřazuje hodnotu NULL přídavných ukazatelů. Toto je také co můžete dělat sami, pokud budete potřebovat uvolnit objekt bez opuštění bloku.

By neměl převést přídavných ukazatelů na nespravované ukazatele a ukazatel this nespravované po používat objekt je již ukotvena (po přídavných ukazatel dostane mimo rozsah). Na rozdíl od ukazatelů gc přídavné ukazatele lze převést na nogc nespravované ukazatele. Je však uživatele zodpovědnost za udržovat přídavné při nespravované ukazatel je používán.

Získání adresy proměnné pomocí připnutých ukazatele a potom pomocí této adresy po přídavných ukazatel dostane mimo rozsah, by neměla být provedena.

// 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.
}

Následující příklad ukazuje správné chování:

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

Příklad

V následujícím příkladu objektu na kterou odkazuje pG je ukotvena, dokud jej předá mimo rozsah:

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

Výstup

1