Compartir a través de


pin_ptr (C++/CLI)

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

Todos los runtimes

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

Windows en tiempo de ejecución

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

Common Language Runtime

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 (Extensiones de componentes de C++).

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

  

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