2009-08-19 6 views
76

Mi è stato detto che una maniglia è una specie di puntatore, ma non, e che ti permette di mantenere un riferimento a un oggetto, piuttosto che all'oggetto stesso. Cos'è una spiegazione più elaborata?Che cos'è un handle in C++?

+6

http://en.wikipedia.org/wiki/Handle_%28computing%29 – Jherico

+0

Cerca nel modello Chain of Responsibility, imparerai che un "Handle" è fondamentalmente un nodo e che un "Handler" è un piccolo insieme di loro. La "magia" deriva dalla ricorsione –

risposta

79

Un handle può essere qualsiasi cosa, da un indice intero a un puntatore a una risorsa nello spazio del kernel. L'idea è che forniscono un'astrazione di una risorsa, quindi non è necessario conoscere molto della risorsa stessa per utilizzarla.

Ad esempio, HWND nell'API Win32 è un handle per una finestra. Di per sé è inutile: non puoi raccogliere alcuna informazione da essa. Ma passalo alle giuste funzioni API e con esso puoi eseguire una serie di trucchi diversi. Internamente puoi pensare all'HWND come un semplice indice nella tabella delle finestre della GUI (che potrebbe non essere necessariamente come è implementato, ma rende la magia sensata).

MODIFICA: non è sicuro al 100% che cosa stiate specificamente chiedendo nella vostra domanda. Si tratta principalmente di puro C/C++.

+10

Un handle può essere utile per il salvataggio degli stati (tra gli altri). Se hai dati in una struttura come std :: vector. L'oggetto potrebbe trovarsi in posizioni di memoria diverse in momenti diversi durante l'esecuzione di un programma, il che significa che il puntatore a quella memoria cambierà i valori. Con una maniglia non cambia mai, fa sempre riferimento al tuo oggetto. Immagina di salvare lo stato di un programma (come in un gioco) - non salverei la posizione di un puntatore ai dati e successivamente importare di nuovo i dati e cercare di ottenere quell'indirizzo in memoria. Puoi tuttavia salvare un handle con i tuoi dati e importare i dati e gestirli. – SinisterRainbow

+0

È possibile convertire una MANIGLIA in un equivalente in Linux? Devo migrare un programma che utilizza HANDLE da Windows a Linux. –

+1

Questa è la risposta corretta, che possono essere qualsiasi cosa e che il codice che li utilizza definisce il tipo di handle. Ho cercato di rendere una versione più concisa della mia risposta simile, non ho potuto aiutare me stesso, per i posteri. @CornelVerster - Sono gli stessi in Linux. Voglio dire, non gli handle del sistema operativo, ma il concetto. Quindi, dipende dall'impugnatura per la sua migrazione, o anche bisogno di migrare. –

4

In C++/CLI, un handle è un puntatore a un oggetto situato nell'heap GC. La creazione di un oggetto nell'heap C++ (non gestito) viene ottenuta utilizzando new e il risultato di un'espressione new è un puntatore "normale". Un oggetto gestito viene allocato sull'heap GC (gestito) con un'espressione gcnew. Il risultato sarà una maniglia. Non è possibile eseguire l'aritmetica del puntatore sulle maniglie. Non maniglie libere. Il GC si prenderà cura di loro. Inoltre, il GC è libero di spostare gli oggetti nell'heap gestito e aggiornare gli handle in modo che facciano riferimento alle nuove posizioni mentre il programma è in esecuzione.

4

Appare nel contesto dello Handle-Body-Idiom, chiamato anche idioma Pimpl. Permette di mantenere l'ABI (interfaccia binaria) di una libreria allo stesso modo, mantenendo i dati reali in un altro oggetto di classe, a cui fa riferimento semplicemente un puntatore contenuto in un oggetto "handle", costituito da funzioni che delegano a tale classe " Corpo".

È anche utile abilitare il time cost e l'eccezione di scambio sicuro di due oggetti. Per questo, è sufficiente che il puntatore che punta sull'oggetto del corpo debba essere scambiato.

25

Una maniglia è una sorta di puntatore in quanto è in genere un modo di fare riferimento a qualche entità.

Sarebbe più preciso dire che un puntatore è un tipo di maniglia, ma non tutti i punti di manipolazione sono puntatori.

Ad esempio, un handle può anche essere un indice in una tabella in memoria, che corrisponde a una voce che contiene un puntatore a un oggetto.

La cosa fondamentale è che quando si ha un "handle", non si sa né si cura di come quella maniglia in realtà finisca per identificare la cosa che identifica, tutto ciò che è necessario sapere è che lo fa.

Dovrebbe anche essere ovvio che non esiste una risposta unica a "che cosa è esattamente un handle", perché le maniglie per cose diverse, anche nello stesso sistema, possono essere implementate in modi diversi "sotto il cofano". Ma non dovresti aver bisogno di preoccuparti di queste differenze.

+1

La tua risposta completa questa https://stackoverflow.com/a/1923646/2188550 – Ivanzinho

41

Un handle è un puntatore o un indice senza alcun tipo visibile collegato ad esso. Di solito si vede qualcosa di simile:

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

Quindi nel tuo codice appena passare trattano circa come un valore opaco.

Nel codice che utilizza l'oggetto, si getta il puntatore a un tipo reale struttura e l'usa:

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

Oppure lo usa come indice per un array/vettore:

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); 
    } 
} 
0
HANDLE hnd; is same as void * ptr; 

HANDLE è un typefed definito nel file winnt.h in visual studio (windows).

I.C: typedef void *HANDLE;

Per saperne di più HANDLE

+1

Questo vale solo per Windows e solo per uno dei tanti tipi di maniglie utilizzate nell'architettura di Windows. Tuttavia, questo ** è ** ciò che sarebbe noto come un "normale handle di Windows a livello di applicazione". –

0

Una maniglia è quello che vuoi che sia.

Un handle può essere un numero intero senza segno utilizzato in alcune tabelle di ricerca.

Un handle può essere un puntatore a, o in, un set di dati più grande.

Dipende da come si comporta il codice che utilizza l'handle. Questo determina il tipo di maniglia.

Il motivo per cui viene utilizzato il termine "handle" è l'importante. Ciò li indica come un tipo di identificazione o tipo di accesso. Significato, per il programmatore, rappresentano un 'chiave' o l'accesso a qualcosa.