web-dev-qa-db-fra.com

Qu'est-ce qu'un descripteur en C ++?

On m'a dit qu'un handle est en quelque sorte un pointeur, mais pas, et qu'il vous permet de conserver une référence à un objet, plutôt que l'objet lui-même. Qu'est-ce qu'une explication plus élaborée?

91
Xenoprimate

Un handle peut être n'importe quoi, d'un index entier à un pointeur sur une ressource dans l'espace du noyau. L'idée est qu'ils fournissent une abstraction d'une ressource, vous n'avez donc pas besoin d'en savoir beaucoup sur la ressource elle-même pour l'utiliser.

Par exemple, le HWND dans l'API Win32 est un handle pour une fenêtre. En soi, c'est inutile: vous ne pouvez en tirer aucune information. Mais passez-le aux bonnes fonctions de l'API, et vous pourrez réaliser une multitude de trucs différents avec. En interne, vous pouvez considérer le HWND comme un simple index dans la table des fenêtres de l'interface graphique (ce qui ne correspond pas nécessairement à la façon dont il est implémenté, mais cela donne un sens à la magie).

EDIT: Pas 100% certain de ce que vous demandiez précisément dans votre question. Il s’agit principalement de C/C++ pur.

93
Matthew Iselin

Un descripteur est un pointeur ou un index auquel aucun type visible n'est associé. Habituellement, vous voyez quelque chose comme:

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

Donc, dans votre code, vous passez simplement HANDLE comme une valeur opaque.

Dans le code qui utilise l'objet, il pointe le pointeur sur un type de structure réel et l'utilise:

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

Ou il l'utilise comme index d'un tableau/vecteur:

 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);
     }
 }
47
jmucchiello

Un handle is est une sorte de pointeur en ce sens qu’il s’agit généralement d’une manière de référencer une entité.

Il serait plus précis de dire qu'un pointeur est un type de poignée, mais que toutes les poignées ne sont pas des pointeurs.

Par exemple, un handle peut également être un index dans une table en mémoire, ce qui correspond à une entrée qui contient elle-même un pointeur sur un objet.

L'essentiel est que, lorsque vous avez un "pseudonyme", vous ne sachiez pas comment il finit par identifier ce qu'il identifie, tout ce que vous devez savoir, c'est que c'est le cas.

Il devrait également être évident qu'il n'y a pas de réponse unique à "Qu'est-ce qu'une poignée?", Car les poignées de choses différentes, même dans le même système, peuvent être mises en œuvre de différentes manières "sous le capot". Mais vous ne devriez pas avoir à vous soucier de ces différences.

27
Deltics

En C++/CLI, un descripteur est un pointeur sur un objet situé sur le segment de mémoire GC. La création d'un objet sur le tas C++ (non géré) est réalisée à l'aide de new et le résultat d'une expression new est un pointeur "normal". Un objet géré est alloué sur le segment de mémoire GC (géré) avec une expression gcnew. Le résultat sera une poignée. Vous ne pouvez pas faire de l'arithmétique de pointeur sur les poignées. Vous ne libérez pas les poignées. Le GC prendra soin d'eux. En outre, le CPG est libre de déplacer des objets sur le segment de mémoire géré et de mettre à jour les descripteurs pour qu'ils pointent vers les nouveaux emplacements pendant l'exécution du programme.

5
Mehrdad Afshari

Cela apparaît dans le contexte du Handle-Body-Idiom , également appelé idiome de Pimpl. Il permet de conserver la même interface ABI (interface binaire) d’une bibliothèque, en conservant les données réelles dans un autre objet de classe, qui est simplement référencé par un pointeur contenu dans un objet "handle", composé de fonctions qui délèguent à cette classe " Corps".

Il est également utile d'activer l'échange permanent de deux objets avec le temps et les exceptions. Pour cela, seul le pointeur pointant sur l'objet body doit être échangé.

5

Un manche est ce que vous voulez qu'il soit.

Un descripteur peut être un entier non signé utilisé dans certaines tables de consultation.

Un descripteur peut être un pointeur sur ou dans un ensemble de données plus volumineux.

Cela dépend du comportement du code utilisant le handle. Cela détermine le type de poignée.

La raison pour laquelle le terme 'handle' est utilisé est ce qui est important. Cela les indique comme un type d’objet d’identification ou d’accès. Signification, pour le programmeur, ils représentent une "clé" o accès à quelque chose.

1
dyasta

HANDLE hnd; est le même que void * ptr;

HANDLE est un typedef défini dans le fichier winnt.h de Visual Studio (Windows):

typedef void *HANDLE;

En savoir plus sur HANDLE

1
Kulamani