Este artículo se tradujo automáticamente. Para ver el artículo en inglés, active la casilla Inglés. Además, puede mostrar el texto en inglés en una ventana emergente si mueve el puntero del mouse sobre el texto.
Traducción
Inglés

pin_ptr (C++/CLI)

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

(No hay notas para esta característica de lenguaje que se aplican 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 de recolección de elementos no utilizados. 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.

1dz8byfh.collapse_all(es-es,VS.110).gifSintaxis

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

1dz8byfh.collapse_all(es-es,VS.110).gifParámetros

más 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.

tipo

Tipo de initializer.

var

El nombre de la variable de pin_ptr .

inicializador

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.

1dz8byfh.collapse_all(es-es,VS.110).gifComentarios

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 subobjeto 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 subobjeto 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 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.

1dz8byfh.collapse_all(es-es,VS.110).gifRequisitos

Opción del compilador: /clr

1dz8byfh.collapse_all(es-es,VS.110).gifEjemplos

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

Output

45

Ejemplo

El ejemplo siguiente se muestra un puntero interior se puede convertir a un puntero anclado, y que el del operador de dirección (&) 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);
};

Output

1

Ejemplo

El ejemplo siguiente se muestra un puntero anclado puede convertirse 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);
}

Output

8255

Adiciones de comunidad

AGREGAR
Mostrar: