Mi è stato detto che un handle è una specie di puntatore, ma non lo è, e che ti permette di mantenere un riferimento a un oggetto, piuttosto che all'oggetto stesso. Qual è una spiegazione più elaborata?
Mi è stato detto che un handle è una specie di puntatore, ma non lo è, e che ti permette di mantenere un riferimento a un oggetto, piuttosto che all'oggetto stesso. Qual è una spiegazione più elaborata?
Risposte:
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 sapere molto sulla risorsa stessa per utilizzarla.
Ad esempio, l'HWND nell'API Win32 è un handle per una finestra. Di per sé è inutile: non puoi ricavarne alcuna informazione. Ma passalo alle funzioni API corrette e puoi eseguire una vasta gamma di trucchi diversi con esso. Internamente puoi pensare all'HWND come a un semplice indice nella tabella delle finestre della GUI (che potrebbe non essere necessariamente il modo in cui è implementato, ma ha senso la magia).
EDIT: Non è sicuro al 100% cosa stavi chiedendo nello specifico nella tua domanda. Si tratta principalmente di puro C / C ++.
Un handle è un puntatore o un indice a cui non è associato alcun tipo visibile. Di solito vedi qualcosa come:
typedef void* HANDLE;
HANDLE myHandleToSomething = CreateSomething();
Quindi nel tuo codice devi solo passare HANDLE come un valore opaco.
Nel codice che utilizza l'oggetto, esegue il cast del puntatore a un tipo di struttura reale e lo utilizza:
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);
}
}
Un handle è una sorta di puntatore in quanto è tipicamente un modo per fare riferimento a un'entità.
Sarebbe più accurato dire che un puntatore è un tipo di handle, ma non tutti gli handle sono puntatori.
Ad esempio, un handle può anche essere un indice in una tabella in memoria, che corrisponde a una voce che a sua volta contiene un puntatore a un oggetto.
La cosa fondamentale è che quando hai una "maniglia", non sai né ti interessa come quella maniglia finisce effettivamente per identificare la cosa che identifica, tutto ciò che devi sapere è che lo fa.
Dovrebbe anche essere ovvio che non esiste un'unica risposta a "che cosa è esattamente una maniglia", perché le maniglie a cose diverse, anche nello stesso sistema, possono essere implementate in modi diversi "sotto il cofano". Ma non dovresti preoccuparti di queste differenze.
In C ++ / CLI, un handle è un puntatore a un oggetto situato nell'heap GC. La creazione di un oggetto sull'heap C ++ (non gestito) si ottiene utilizzando new
e il risultato di new
un'espressione è un puntatore "normale". Un oggetto gestito viene allocato sull'heap GC (gestito) con gcnew
un'espressione. Il risultato sarà una maniglia. Non puoi eseguire operazioni aritmetiche con i puntatori sulle maniglie. Non liberi le maniglie. Il GC si prenderà cura di loro. Inoltre, il GC è libero di riposizionare gli oggetti sull'heap gestito e aggiornare gli handle in modo che puntino alle nuove posizioni mentre il programma è in esecuzione.
Questo appare nel contesto del linguaggio Handle-Body-Idiom , chiamato anche idioma Pimpl. Consente di mantenere invariata l'ABI (interfaccia binaria) di una libreria, mantenendo i dati effettivi in un altro oggetto di classe, a cui fa semplicemente riferimento un puntatore tenuto in un oggetto "handle", costituito da funzioni che delegano a quella classe " Corpo".
È anche utile per abilitare il tempo costante e lo scambio sicuro rispetto alle eccezioni di due oggetti. Per questo, deve essere scambiato semplicemente il puntatore che punta all'oggetto del corpo.
Una maniglia è qualunque cosa tu voglia 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ù ampio.
Dipende da come si comporta il codice che utilizza l'handle. Questo determina il tipo di maniglia.
Ciò che è importante è il motivo per cui viene utilizzato il termine " maniglia ". Ciò li indica come identificazione o tipo di accesso dell'oggetto. Significa che per il programmatore rappresentano una "chiave" o l' accesso a qualcosa.
HANDLE hnd;
equivale a void * ptr;
HANDLE è un typedef definito nel file winnt.h in Visual Studio (Windows):
typedef void *HANDLE;
Maggiori informazioni su HANDLE