std::unique_ptr mit benutzerdefiniertem Löscher für win32 LocalFree

std::unique_ptr mit benutzerdefiniertem Löscher für win32 LocalFree

Für mich sieht es richtig aus. Sie könnten es etwas prägnanter machen, indem Sie den unique_ptr angeben 's deleter inline, anstatt einen Funktor dafür zu erstellen.

std::unique_ptr<LPWSTR, HLOCAL(__stdcall *)(HLOCAL)> 
      p( ::CommandLineToArgvW( L"cmd.exe p1 p2 p3", &n ), ::LocalFree );

Oder, wenn Sie sich nicht mit LocalFree anlegen wollen der Signatur und den Aufrufkonventionen von können Sie ein Lambda verwenden, um die Löschung vorzunehmen.

std::unique_ptr<LPWSTR, void(*)(LPWSTR *)> 
      p( ::CommandLineToArgvW( L"cmd.exe p1 p2 p3", &n ), 
         [](LPWSTR *ptr){ ::LocalFree( ptr ); } );

Hinweis: Als diese Antwort zum ersten Mal geschrieben wurde, war VS2010 die veröffentlichte verfügbare VS-Version. Es unterstützt keine Konvertierung von Lambdas ohne Erfassung in Funktionszeiger, daher müssten Sie std::function verwenden im zweiten Beispiel

std::unique_ptr<LPWSTR, std::function<void(LPWSTR *)>> 
      p( ::CommandLineToArgvW( L"cmd.exe p1 p2 p3", &n ), 
         [](LPWSTR *ptr){ ::LocalFree( ptr ); } );

Das Deklarieren eines benutzerdefinierten Löschers ist nicht so schön, die Verwendung von decltype() ist schneller. std::shared_ptr ist eine Alternative, aber größer als std::unique_ptr . Wenn Sie keinen Zeiger teilen möchten, nehmen Sie einen unique_ptr .

std::unique_ptr<LPWSTR, decltype(::LocalFree)> 
     p( ::CommandLineToArgvW( L"cmd.exe p1 p2 p3", &n ), ::LocalFree );

Ich finde shared_ptr ein bisschen nützlicher als generischer Ressourcenwächter. Es erfordert nicht, dass der Deleter Teil von Template-Argumenten ist und kann daher leicht weitergegeben werden.

std::shared_ptr<LPWSTR> p(
    ::CommandLineToArgvW(L"cmd.exe p1 p2 p3", &n),
    ::LocalFree);