Mir wurde gesagt, dass ein Handle eine Art Zeiger ist, aber nicht, und dass Sie damit einen Verweis auf ein Objekt und nicht auf das Objekt selbst behalten können. Was ist eine ausführlichere Erklärung?
Mir wurde gesagt, dass ein Handle eine Art Zeiger ist, aber nicht, und dass Sie damit einen Verweis auf ein Objekt und nicht auf das Objekt selbst behalten können. Was ist eine ausführlichere Erklärung?
Antworten:
Ein Handle kann alles sein, von einem Ganzzahlindex bis zu einem Zeiger auf eine Ressource im Kernelraum. Die Idee ist, dass sie eine Abstraktion einer Ressource bereitstellen, sodass Sie nicht viel über die Ressource selbst wissen müssen, um sie zu verwenden.
Beispielsweise ist der HWND in der Win32-API ein Handle für ein Fenster. An sich ist es nutzlos: Sie können keine Informationen daraus gewinnen. Übergeben Sie es jedoch an die richtigen API-Funktionen, und Sie können damit eine Vielzahl verschiedener Tricks ausführen. Intern können Sie sich den HWND nur als einen Index in der Fenstertabelle der GUI vorstellen (was möglicherweise nicht unbedingt so ist, wie er implementiert ist, aber die Magie macht Sinn).
EDIT: Nicht 100% sicher, was genau Sie in Ihrer Frage gefragt haben. Hier geht es hauptsächlich um reines C / C ++.
Ein Handle ist ein Zeiger oder Index, an den kein sichtbarer Typ angehängt ist. Normalerweise sehen Sie so etwas wie:
typedef void* HANDLE;
HANDLE myHandleToSomething = CreateSomething();
In Ihrem Code geben Sie HANDLE einfach als undurchsichtigen Wert weiter.
In dem Code, der das Objekt verwendet, wird der Zeiger auf einen realen Strukturtyp umgewandelt und verwendet:
int doSomething(HANDLE s, int a, int b) {
Something* something = reinterpret_cast<Something*>(s);
return something->doit(a, b);
}
Oder es verwendet es als Index für ein Array / einen Vektor:
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);
}
}
Ein Handle ist insofern eine Art Zeiger, als es normalerweise eine Art ist, auf eine Entität zu verweisen.
Es wäre genauer zu sagen, dass ein Zeiger eine Art von Handle ist, aber nicht alle Handles sind Zeiger.
Beispielsweise kann ein Handle auch ein Index in einer In-Memory-Tabelle sein, der einem Eintrag entspricht, der selbst einen Zeiger auf ein Objekt enthält.
Das Wichtigste ist, dass Sie, wenn Sie ein "Handle" haben, weder wissen noch sich darum kümmern, wie dieses Handle das identifizierte Objekt identifiziert. Alles, was Sie wissen müssen, ist, dass es das tut.
Es sollte auch offensichtlich sein, dass es keine einheitliche Antwort auf "Was genau ist ein Handle" gibt, da Handles für verschiedene Dinge, selbst im selben System, auf unterschiedliche Weise "unter der Haube" implementiert werden können. Aber Sie sollten sich nicht mit diesen Unterschieden befassen müssen.
In C ++ / CLI ist ein Handle ein Zeiger auf ein Objekt auf dem GC-Heap. Das Erstellen eines Objekts auf dem (nicht verwalteten) C ++ - Heap erfolgt mithilfe von new
und das Ergebnis eines new
Ausdrucks ist ein "normaler" Zeiger. Ein verwaltetes Objekt wird auf dem GC-Heap (verwaltet) mit einem gcnew
Ausdruck zugewiesen . Das Ergebnis wird ein Handle sein. Sie können keine Zeigerarithmetik für Ziehpunkte ausführen. Sie geben keine Griffe frei. Der GC wird sich um sie kümmern. Außerdem kann der GC Objekte auf dem verwalteten Heap verschieben und die Handles aktualisieren, um auf die neuen Speicherorte zu verweisen, während das Programm ausgeführt wird.
Dies erscheint im Kontext des Handle-Body- Idioms, auch Pimpl-Idiom genannt. Es ermöglicht, die ABI (binäre Schnittstelle) einer Bibliothek gleich zu halten, indem die tatsächlichen Daten in einem anderen Klassenobjekt gespeichert werden, auf das lediglich durch einen Zeiger verwiesen wird, der in einem "Handle" -Objekt enthalten ist, das aus Funktionen besteht, die an diese Klasse delegieren. " Körper".
Es ist auch nützlich, einen konstanten zeit- und ausnahmesicheren Austausch zweier Objekte zu ermöglichen. Dazu muss lediglich der Zeiger auf das Körperobjekt getauscht werden.
Ein Griff ist das, was Sie wollen.
Ein Handle kann eine vorzeichenlose Ganzzahl sein, die in einer Nachschlagetabelle verwendet wird.
Ein Handle kann ein Zeiger auf oder in einen größeren Datensatz sein.
Dies hängt davon ab, wie sich der Code, der das Handle verwendet, verhält. Das bestimmt den Handle-Typ.
Der Grund, warum der Begriff " Handle " verwendet wird, ist wichtig. Dies zeigt sie als Identifikations- oder Zugriffstyp eines Objekts an. Für den Programmierer bedeutet dies, dass sie einen „Schlüssel“ oder Zugriff auf etwas darstellen.
HANDLE hnd;
ist das gleiche wie void * ptr;
HANDLE ist ein typedef, der in der Datei winnt.h in Visual Studio (Windows) definiert ist:
typedef void *HANDLE;
Lesen Sie mehr über GRIFF