Ich habe vor kurzem eine allgemeine Frage über RAII bei SO. Allerdings habe ich noch einige Implementierungsprobleme mit meinem Beispiel von HANDLE.Making ein HANDLE RAII-konform mit shared_ptr mit einem benutzerdefinierten Löscher
Ein HANDLE
ist typedeffed zu void *
in windows.h
. Daher muss die richtige shared_ptr
Definition
std::tr1::shared_ptr<void> myHandle (INVALID_HANDLE_VALUE, CloseHandle);
Beispiel 1CreateToolhelp32Snapshot
sein: gibt HANDLE
und arbeitet.
const std::tr1::shared_ptr<void> h
(CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL), CloseHandle);
Wie verwende ich void
in der Definition (was der richtige Weg ist?) Probleme weitergehen, wenn ich versuche, etwas mehr zu nennen winapi mit diesem Zeiger-Befehlen. Sie funktionieren funktional, sind aber hässlich und ich bin mir sicher, dass es eine bessere Lösung geben muss.
In den folgenden Beispielen ist h
ein Zeiger, der über die Definition oben erstellt wurde.
Beispiel 2OpenProcessToken
: Letztes Argument ist ein PHANDLE
. Medium hässlich mit der Besetzung.
OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,
(PHANDLE)&h);
Beispiel 3Process32First
: erste Argument ist ein HANDLE
. Echt hässlich.
Process32First(*((PHANDLE)&h), &pEntry);
Beispiel 4 einfacher Vergleich mit einer konstanten HANDLE
. Echt hässlich.
if (*((PHANDLE)&h) == INVALID_HANDLE) { /* do something */ }
Was ist die richtige Methode, um ein korrektes shared_ptr für ein HANDLE zu erstellen?
Gibt es eine Möglichkeit, den unsicheren 'GRIFF' zu löschen, nachdem Sie ihn in Ihrem ersten Beispiel 2 Code-Snippet in einen sicheren umgewandelt haben? – Etan
Sie könnten ein Funktionswrapping OpenProcessHandle() erstellen (ich fügte dies dem Post hinzu) oder dasselbe tun als im zweiten Snippet, wobei shared_h mit INVALID_HANDLE_VALUE initialisiert wird –