2009-08-19 19 views
76

Mir wurde gesagt, dass ein Handle eine Art von Zeiger ist, aber nicht, und dass es Ihnen erlaubt, einen Verweis auf ein Objekt, anstatt das Objekt selbst zu behalten. Was ist eine ausführlichere Erklärung?Was ist ein Handle in C++?

+6

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

+0

Schauen Sie sich das Chain of Responsibility-Muster an, Sie werden lernen, dass ein "Handle" im Grunde ein Knoten ist und dass ein "Handler" ist eine kleine Gruppe von ihnen. Die "Magie" kommt von Rekursion –

Antwort

79

Ein Handle kann alles von einem Integer-Index bis zu einem Zeiger auf eine Ressource im Kernel-Bereich sein. Die Idee ist, dass sie eine Abstraktion einer Ressource bereitstellen, so dass Sie nicht viel über die Ressource selbst wissen müssen, um sie zu verwenden.

Zum Beispiel ist das HWND in der Win32-API ein Handle für ein Fenster. Für sich genommen 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 kann man sich das HWND nur als einen Index in die Fenstertabelle der GUI vorstellen (was nicht notwendigerweise so ist, wie es implementiert ist, aber es macht die Magie sinnvoll).

EDIT: Nicht 100% sicher, was speziell Sie in Ihrer Frage gefragt haben. Hier geht es hauptsächlich um reines C/C++.

+10

Ein Handle kann nützlich sein, um Zustände (unter anderem) zu speichern. Wenn Sie Daten in einer Struktur wie einem std :: vector haben. Ihr Objekt kann sich während der Ausführung eines Programms zu verschiedenen Zeiten an verschiedenen Speicherorten befinden, was bedeutet, dass Ihr Zeiger auf diesen Speicher die Werte ändert. Mit einem Handle ändert es sich nie, es verweist immer auf Ihr Objekt. Stellen Sie sich vor, Sie speichern einen Zustand eines Programms (wie in einem Spiel) - Sie würden einen Zeigerspeicher nicht auf Daten speichern und später die Daten erneut importieren und versuchen, diese Adresse in den Speicher zu bekommen. Sie können jedoch ein Handle mit Ihren Daten speichern und die Daten importieren und verarbeiten. – SinisterRainbow

+0

Ist es möglich, ein HANDLE in ein Äquivalent in Linux zu konvertieren? Ich muss ein Programm migrieren, das HANDLE von Windows zu Linux verwendet. –

+1

Das ist die richtige Antwort, dass sie alles sein können und dass der Code, der sie verwendet, den Typ des Handles definiert. Ich versuchte, eine kompaktere Version meiner eigenen ähnlichen Antwort zu machen, konnte mir selbst nicht helfen, für die Nachwelt. @CornelVerster - Sie sind in Linux identisch. Ich meine, nicht OS Griffe, sondern das Konzept. Es kommt also auf die Migration an, oder muss sogar migriert werden. –

4

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 wird mithilfe von new erreicht und das Ergebnis eines new-Ausdrucks ist ein "normaler" Zeiger. Ein verwaltetes Objekt wird auf dem GC-Heap (verwaltet) mit einem gcnew-Ausdruck zugeordnet. Das Ergebnis wird ein Handle sein. Sie können Zeigerarithmetik nicht auf Handles ausführen. Sie geben Griffe nicht frei. Der GC wird sich um sie kümmern. Darüber hinaus kann der GC Objekte auf dem verwalteten Heap verschieben und die Handles aktualisieren, um während der Ausführung des Programms auf die neuen Speicherorte zu zeigen.

4

Dies erscheint im Zusammenhang mit der Handle-Body-Idiom, auch Pimpl Idiom genannt. Es ermöglicht, die ABI (binäre Schnittstelle) einer Bibliothek gleich zu halten, indem tatsächliche Daten in einem anderen Klassenobjekt gespeichert werden, auf das lediglich ein Zeiger in einem "handle" -Objekt verweist, das aus Funktionen besteht, die an diese Klasse delegieren. Karosserie".

Es ist auch nützlich, um einen konstanten Zeit- und Ausnahmesicherheitsaustausch von zwei Objekten zu ermöglichen. Dazu muss lediglich der auf das Körperobjekt zeigende Zeiger getauscht werden.

25

Ein Handle ist eine Art Zeiger in dem es in der Regel eine Möglichkeit 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.

Zum Beispiel kann ein Handle auch ein Index in eine in-memory-Tabelle sein, die einem Eintrag entspricht, der selbst einen Zeiger auf ein Objekt enthält.

Die Schlüssel Sache ist, dass, wenn Sie ein "Handle" haben, Sie weder wissen noch kümmern, wie dieses Handle letztlich identifiziert die Sache, die es identifiziert, alles, was Sie wissen müssen, ist, dass es tut.

Es sollte auch offensichtlich sein, dass es keine einheitliche Antwort auf "was genau ist ein Griff" gibt, weil Griffe auf verschiedene Dinge, sogar im selben System, auf verschiedene Arten "unter der Haube" implementiert werden können. Aber Sie sollten sich nicht mit diesen Unterschieden befassen müssen.

+1

Ihre Antwort ergänzt diese eine https://stackoverflow.com/a/1923646/2188550 – Ivanzinho

41

Ein Handle ist ein Zeiger oder Index ohne sichtbaren Typ. Normalerweise sehen Sie etwas wie:

Also in Ihrem Code übergeben Sie einfach GRIFF herum als undurchsichtiger Wert.

In dem Code, der das Objekt verwendet, wirft er den Zeiger auf eine echte Strukturtyp und verwendet sie:

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

oder er verwendet es als ein Index auf ein Array/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); 
    } 
} 
0
HANDLE hnd; is same as void * ptr; 

HANDLE ist ein typefed in Winnt.h-Datei in Visual Studio (Windows) definiert.

I.c: typedef void *HANDLE;

Lesen Sie mehr über HANDLE

+1

Das gilt nur für Windows und nur eine von vielen Arten von Handles durch die Windows-Architektur verwendet. Das ** ist **, was als "normaler Windows-Anwendungslevel-Handle" bekannt wäre. –

0

Ein Griff ist, was auch immer Sie es sein wollen.

Ein Handle kann eine Ganzzahl ohne Vorzeichen sein, die in einer Nachschlagetabelle verwendet wird.

Ein Handle kann ein Zeiger auf oder in einen größeren Datensatz sein.

Es hängt davon ab, wie sich der Code verhält, der den Handle verwendet. Das bestimmt den Handle-Typ.

Der Grund, warum der Begriff 'Handle' verwendet wird, ist was wichtig ist. Das zeigt sie als Identifikations- oder Zugriffstyp des Objekts an. Das heißt, für den Programmierer stellen sie einen "Schlüssel" oder Zugriff auf etwas.