catch c++ handle

catch - ¿Qué es un controlador en C++?



exception c++ (7)

Me han dicho que un identificador es una especie de puntero, pero no lo es, y que te permite mantener una referencia a un objeto, en lugar de al objeto mismo. ¿Cuál es una explicación más elaborada?


En C ++ / CLI, un identificador es un puntero a un objeto ubicado en el montón del GC. La creación de un objeto en el montón de C ++ (no administrado) se logra utilizando new y el resultado de una new expresión es un puntero "normal". Un objeto gestionado se asigna en el montón GC (gestionado) con una expresión gcnew . El resultado será un mango. No se puede hacer aritmética de punteros en los controladores. Usted no libera identificadores. El GC se encargará de ellos. Además, el GC puede reubicar objetos en el montón administrado y actualizar los identificadores para que apunten a las nuevas ubicaciones mientras el programa se está ejecutando.


Esto aparece en el contexto de Handle-Body-Idiom , también llamado modismo Pimpl. Permite mantener la ABI (interfaz binaria) de una biblioteca, manteniendo los datos reales en otro objeto de clase, al que hace referencia simplemente un puntero en un objeto "handle", que consiste en funciones que delegan en esa clase " Cuerpo".

También es útil habilitar el intercambio seguro de tiempo y seguridad de dos objetos. Para esto, simplemente debe intercambiarse el puntero que apunta al objeto del cuerpo.


Un identificador es una especie de puntero en el sentido de que normalmente es una forma de referenciar a una entidad.

Sería más exacto decir que un puntero es un tipo de manejador, pero no todos los manejadores son punteros.

Por ejemplo, un identificador también puede ser un índice en una tabla de memoria, que corresponde a una entrada que contiene un puntero a algún objeto.

La clave es que cuando tienes un "mango", ni sabes ni te importa cómo ese identificador realmente termina identificando lo que identifica, todo lo que necesitas saber es que sí lo hace.

También debería ser obvio que no hay una sola respuesta a "qué es exactamente un identificador", porque se maneja a diferentes cosas, incluso en el mismo sistema, se puede implementar de diferentes maneras "bajo el capó". Pero no debería preocuparse por esas diferencias.


Un identificador es un puntero o índice sin ningún tipo visible asociado. Usualmente ves algo como:

typedef void* HANDLE; HANDLE myHandleToSomething = CreateSomething();

Entonces en tu código simplemente pasas HANDLE alrededor como un valor opaco.

En el código que usa el objeto, arroja el puntero a un tipo de estructura real y lo usa:

int doSomething(HANDLE s, int a, int b) { Something* something = reinterpret_cast<Something*>(s); return something->doit(a, b); }

O lo usa como un índice para una matriz / vector:

int doSomething(HANDLE s, int a, int b) { int index = (int)s; try { Something& something = vecSomething[index]; return something.doit(a, b); } catch (boundscheck& e) { throw SomethingException(INVALID_HANDLE); } }


Un identificador puede ser cualquier cosa, desde un índice entero a un puntero a un recurso en el espacio del kernel. La idea es que proporcionen una abstracción de un recurso, por lo que no necesita saber mucho sobre el recurso en sí para usarlo.

Por ejemplo, el HWND en la API Win32 es un controlador para una ventana. Por sí solo es inútil: no puedes obtener ninguna información de él. Pero pásalo a las funciones API correctas, y puedes realizar una gran cantidad de trucos diferentes con él. Internamente, puede pensar que HWND es solo un índice en la tabla de ventanas de la GUI (que puede no ser necesariamente la forma en que se implementa, pero hace que la magia tenga sentido).

EDITAR: no está 100% seguro de lo que específicamente estaba haciendo en su pregunta. Esto se trata principalmente de puro C / C ++.


Un mango es lo que quieras que sea.

Un identificador puede ser un entero sin signo utilizado en alguna tabla de búsqueda.

Un identificador puede ser un puntero a, o dentro de, un conjunto de datos más grande.

Depende de cómo se comporte el código que usa el identificador. Eso determina el tipo de mango.

La razón por la cual se usa el término " manejar " es lo que es importante. Eso los indica como un tipo de identificación o acceso de objeto. Es decir, para el programador, representan una "clave" o acceso a algo.


HANDLE hnd; is same as void * ptr;

HANDLE es un tipo de letra definido en el archivo winnt.h en visual studio (windows).

ic: typedef void *HANDLE;

Leer más sobre HANDLE