pin_ptr (C++/CLI)
Deklaruje Připnutí ukazatel, který se používá pouze s společného jazykového modulu runtime.
Všechny knihovny runtime
(Nejsou žádné poznámky pro tuto funkci jazyka, které platí pro všechny knihovny runtime.)
Windows Runtime
(Tato funkce jazyka nejsou v modulu Runtime v systému Windows podporovány.)
Modul CLR (Common Language Runtime)
A Připnutí ukazatel je vnitřní ukazatel, který brání objekt aktivní přesouvat na něho uvolněna haldy.Je hodnota pinning ukazatel nezmění společného jazykového modulu runtime.Toto je vyžadováno při předání adresy spravované třídy nespravované funkce tak, aby adresy nezmění neočekávaně během volání funkce nespravovaným rozlišení.
Syntaxe
[cli::]pin_ptr<cv_qualifier type> var = &initializer;
Parametry
cv_qualifier
constnebo volatile kvalifikátory.Standardně je pinning ukazatel volatile.Je ale není chyba deklarovat pinning ukazatel redundantní volatile.Typ
Typ initializer.var
Název pin_ptr proměnné.Inicializátor
Člen typ odkazu, prvek spravovaného pole nebo jiný objekt, který můžete přiřadit nativní ukazatel.
Poznámky
A pin_ptr představuje nadmnožinu funkce nativního ukazatel.Proto vše, co může být přiřazena nativní ukazatele lze také přiřadit k pin_ptr.Vnitřní ukazatel je povoleno provádět stejnou sadu jako nativní ukazatele, včetně porovnání a ukazatel aritmetické operace.
Objekt nebo spravované třídy sub-object, lze připojit, v případě společného jazykového modulu runtime nepřesune ji během úklidu.Hlavní použití tohoto je předat ukazatel spravovaná data jako skutečný parametr funkce Nespravovaná volání.Během shromažďování cyklu runtime bude kontrolovat metadata pro pinning ukazatel a nepřesune položku, na kterou odkazuje.
Připnutí objekt také PinY její hodnotu pole; pole základní nebo hodnotu zadejte.Však polí deklarovaných sledování popisovač (%) není připojena.
Sub-object, definované v objektu spravovaný Připnutí má efekt Připnutí celý objekt.
Pokud ukazatel pinning přeřazen k na novou hodnotu, na předchozí instance se již nepovažuje za držení.
Objekt umístěn pouze při pin_ptr odkazuje na něj.Objekt je již připojené při jeho pinning ukazatel dostane mimo rozsah nebo je nastavena na nullptr.Po pin_ptr přejde mimo rozsah, objekt, který byl v držení může být přesunut haldy odpadků kolekcí.Nebudou aktualizovány všechny nativní ukazatelů, které i nadále odkazovat na objekt a jeden z nich de-referencing může vyvolat výjimku neodstranitelné.
Pokud žádné ukazatele pinning bodu objektu (všechny ukazatele pinning byla mimo rozsah, byly přeřazen k na jiné objekty nebo byly přiřazeny nullptr), objekt je zaručena přidržet.
Pinning ukazatel může odkazovat na táhlo referenční hodnota typu popisovač typu krabici, člen spravované typu nebo prvek spravovaného pole.Nelze odkazovat na typ odkazu.
S ohledem na adresu pin_ptr , že body nativní objekt způsobuje nedefinované chování.
Pinning ukazatele lze deklarovat pouze jako nestatický lokální proměnné v zásobníku.
Pinning ukazatelů nelze použít jako:
Parametry funkce
Návratový typ funkce
člen třídy
Typ cíle osazení.
pin_ptrje cli oboru názvů.Další informace naleznete v tématu Obory názvů Platform, default a cli (rozšíření komponent C++).
Další informace o vnitřní odkazy v tématu interior_ptr (C++/CLI).
Další informace o Připnutí ukazatele, viz Jak: Pin ukazatele a matice a Jak: deklarovat Připnutí ukazatele a typy hodnot.
Požadavky
Volba kompilátoru:/clr
Příklady
Příklad
Následující příklad používá pin_ptr omezit pozice 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ůžete převést na pinning ukazatel a návrat zadejte adresu z operátor (&) je vnitřní ukazatel při operand je ve spravovaných haldách.
// 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
Příklad
Následující příklad ukazuje, že pinning ukazatel můžete obsadit 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