pin_ptr (C++/CLI)

 

Para obtener la documentación más reciente de Visual Studio 2017 RC, consulte Documentación de Visual Studio 2017 RC.

Declara un puntero anclado, que solo se utiliza con Common Language Runtime.

(No hay notas para esta característica de lenguaje que se apliquen a todos los runtimes.)

(Esta característica de lenguaje no se admite en tiempo de ejecución de Windows).

Un puntero anclado es un puntero interior que evita el objeto informa a móvil en la pila basura- obtenida. Es decir, el valor de un puntero anclado no cambia por Common Language Runtime. Esto es necesario cuando se pasa la dirección de una clase administrada a una función no administrada de modo que la dirección no cambie inesperado durante la resolución de la llamada de función no administrada.

Sintaxis

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

Parámetros

cv_qualifier
const o calificadores de volatile . De forma predeterminada, un puntero anclado es volatile. Es redundante pero no un error declarar un puntero anclado volatile.

type
Tipo de initializer.

var
El nombre de la variable de pin_ptr .

initializer
Un miembro de un tipo de referencia, un elemento de una matriz administrada, o de cualquier otro objeto que puede asignar a un puntero nativo.

Comentarios

pin_ptr representa un supraconjunto de la funcionalidad de un puntero nativo. Por consiguiente, cualquier elemento que se puede asignar a un puntero nativo se puede asignar a pin_ptr. Permiten a un puntero interior para realizar el mismo conjunto de operaciones que punteros nativos, incluidos comparación y la aritmética con punteros.

Un objeto o un sub- objeto de una clase administrada puede anclarse, en cuyo caso el Common Language Runtime no la mueve durante la recolección de elementos no utilizados. El uso principal de esto es pasar un puntero a datos administrados como parámetro real de una llamada de función no administrada. Durante un ciclo de la colección, el runtime inspeccionará metadatos creados para un puntero anclado y no mueva el elemento que elija.

El anclaje terminales de un objeto también sus campos Valor; es decir, campos de primitivo o tipo de valor. Sin embargo, los campos declarados siguiendo el identificador (%) no se anclan.

Anclar un sub- objeto definido en un objeto administrado tiene el efecto de anclaje el objeto completo.

Si reasignan el puntero anclado elija un nuevo valor, la instancia anterior designada en no se considera anclada.

Se ancla un objeto solo mientras los puntos de pin_ptr al. El objeto se ancla ya no cuando el puntero anclado sale del ámbito, o se establece en nullptr. Después de que pin_ptr salga del ámbito, el objeto que se anclado se puede desplazar en la pila por el recolector de elementos no utilizados. No se actualizarán a punteros nativa que todavía señalan al objeto, y de- haciendo referencia a uno de ellos pueden provocar una excepción irrecuperable.

Si no hay ningún punto de punteros anclado al objeto (todos los punteros que anclaban salieron de ámbito, se reasignados elija otros objetos, o asignados nullptr), el objeto para no anclarse.

Un puntero anclado puede señalar a un identificador de referencia, un tipo de valor o identificador ha de tipo, miembro de un tipo administrado, o un elemento de una matriz administrada. No puede señalar a un tipo de referencia.

Tomar la dirección de pin_ptr que señala a un objeto nativo produce un comportamiento indefinido.

Punteros anclados sólo se puede declarar como variables locales no estáticas en la pila.

Punteros anclados no se puede utilizar como:

  • parámetros de función

  • tipo de valor devuelto de una función

  • un miembro de una clase

  • el tipo de destino de una conversión.

pin_ptr está en el espacio de nombres cli . Para obtener más información, vea Espacios de nombres de plataforma, predeterminado y CLI.

Para obtener más información sobre punteros interiores, vea interior_ptr (C++/CLI).

Para obtener más información sobre los punteros anclados, vea Cómo: Anclar punteros y matrices y Cómo: Declarar punteros anclados y tipos de valor.

Requisitos

Opción del compilador: /clr

Ejemplos

Ejemplo

El ejemplo siguiente utiliza pin_ptr para restringir la posición del primer elemento de una matriz.

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

Resultados

45 Ejemplo

El ejemplo siguiente se muestra un puntero interior se puede convertir a un puntero anclado, y que el del dirección- de operator (&) es un puntero interior al operando se encuentra en el montón administrado.

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

Resultados

1 Ejemplo

El ejemplo siguiente se muestra un puntero anclado puede ser echado a otro tipo.

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

Resultados

8
255

Mostrar: