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:
unique_ptr<new CHandle(h)>
. Dies macht das unique_ptr<T>
selbst ziemlich nutzlos. HANDLE
spezifische Smart Pointer-Klasse, die unique_ptr<T>
. 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?
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.
Das gleiche Prinzip gilt für shared_ptr
und tatsächlich für HANDLE
.
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).
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%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.
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.
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.