Wie verwende ich C ++ - Standard-Smartpointer mit Windows-HANDLE?

7

Ich habe mich gefragt, ob es eine Möglichkeit gibt, unique_ptr<T> mit Windows-GRIFFEN zu verwenden?

Ich dachte, die std::default_delete durch spezifische handle_trats zu ersetzen, die CloseHandle aufrufen. Das Problem ist, dass HANDLE definiert ist als void* unique_ptr<void> wird nicht kompiliert, da sizeof(void) nicht definiert ist.

Bisher sehe ich nur zwei Möglichkeiten:

  1. Erstellen Sie eine Wrapper-Klasse für HANDLE und verwenden Sie sie wie folgt: unique_ptr<new CHandle(h)> . Dies macht das unique_ptr<T> selbst ziemlich nutzlos.
  2. Verwenden Sie HANDLE spezifische Smart Pointer-Klasse, die unique_ptr<T> .
  3. ähnelt

Was halten Sie für die bessere Wahl? Was würdest du vorschlagen?

Die Frage kann für COM IUnknown Zeiger erweitert werden - kann CComPtr durch einen der Standard Smart Pointer ersetzt werden?

    
devdimi 23.03.2012, 16:31
quelle

9 Antworten

7
  

Die Frage kann für COM-IUnknown-Zeiger erweitert werden - can CComPtr   durch einen der Standard-Smart-Pointer ersetzt werden?

Ja. Sie spezialisieren nicht std::default_deleter , sondern ersetzen einfach den Deleter-Typ.

%Vor%

Das gleiche Prinzip gilt für shared_ptr und tatsächlich für HANDLE .

    
Puppy 23.03.2012, 16:45
quelle
6

Erstellen Sie eine bestimmte Smart-Pointer-Klasse, dauert nicht lange. Missbrauche Bibliotheksklassen nicht. Handle-Semantik unterscheidet sich ziemlich von der eines C ++ - Zeigers; Zum einen macht die Dereferenzierung eines HANDLE keinen Sinn.

Ein Grund mehr, eine benutzerdefinierte Smart-Handle-Klasse zu verwenden - NULL bedeutet nicht immer ein leeres Handle. Manchmal ist es INVALID_HANDLE_VALUE, was nicht dasselbe ist (eigentlich -1).

    
Seva Alekseyev 23.03.2012 16:35
quelle
2

Sie können Ihren unique_ptr mit einem benutzerdefinierten Löschprogramm eingeben

%Vor%     
mkaes 23.03.2012 16:55
quelle
1

Sie können eine Deleter-Klasse erstellen, die das Handle freigibt, anstatt delete () aufzurufen.

Sie können in diesem LINK sehen, wie diese gelöst wurden Löschen von Arrays mit einem shared_ptr (unique_ptr hat auch einen Konstruktor, der eine Delete-Klasse erhält)

%Vor%     
Yochai Timmer 23.03.2012 16:39
quelle
1

Ich empfehle nicht, intelligente Zeiger mit Handles zu verwenden.

Ich empfehle Ihnen, einen Vorschlag zum Hinzufügen zusätzlicher RAII-Wrapper zur Standardbibliothek und bei die Nachteile der Verwendung von Smartpointern mit Handles .

Persönlich verwende ich die Referenzimplementierung dieses Vorschlags, anstatt std::unique_ptr für diese Situationen zu verwenden.

    
pepper_chico 15.02.2013 23:49
quelle
1

noch eine andere Lösung

%Vor%     
Alexander Drichel 04.06.2013 15:55
quelle
1

inspiriert von Alexander Drichels Lösung, hier ist noch kürzer

%Vor%

Funktioniert in MSVC 2010. Beachten Sie, dass Sie '& amp;' für den Funktionsnamen in declltype (), um einen Pointer-to-function-Typ abzuleiten.

    
Roman Kruglov 08.10.2014 13:15
quelle
1

Ein HANDLE schließt nicht immer mit CloseHandle (), Vorsicht. Zum Beispiel muss ein mit FindNextFile () geöffnetes HANDLE mit FindClose () geschlossen werden.

    
Michael 10.01.2015 16:04
quelle
0

Sie müssen CloseHandle() verwenden, um einen Handle zu "schließen" statt mit delete . Sie werden von Windows gelöscht, sobald sie nicht an anderer Stelle geöffnet werden. Sie könnten also einen Wrapper schreiben, der CloseHandle () aufruft, anstatt ihn zu löschen. Sie könnten auch Ihre eigene Smartpointer-Klasse schreiben, die vielleicht besser ist, da kein Wrapper mehr benötigt wird.

    
Alex 23.03.2012 16:37
quelle

Tags und Links