Ich habe die win32 API CommandLineToArgvW
die eine LPWSTR*
und gibt mir warnt davor, dassstd :: unique_ptr mit benutzerdefinierten deleter für win32 Localfree
CommandLineToArgvW
für Zeiger auf die Argument Strings einen Block von zusammenhängenden Speicher zuweist, und für die Argumentketten selbst; Die aufrufende Anwendung muss den von der Argumentliste verwendeten Speicher freigeben, wenn sie nicht mehr benötigt wird. Um den Speicher freizugeben, verwenden Sie einen Einzelruf an dieLocalFree
-Funktion.
Siehe http://msdn.microsoft.com/en-us/library/windows/desktop/bb776391(v=vs.85).aspx
Was ist ein C++ idiomatische Weg, um den Speicher im obigen Fall zu befreien?
ich zu einem std::unique_ptr
mit einem benutzerdefinierten deleter dachte, so etwas wie die:
#include <Windows.h>
#include <memory>
#include <iostream>
template< class T >
struct Local_Del
{
void operator()(T*p){::LocalFree(p);}
};
int main(int argc, char* argv[])
{
{
int n = 0;
std::unique_ptr< LPWSTR, Local_Del<LPWSTR> > p(::CommandLineToArgvW(L"cmd.exe p1 p2 p3",&n));
for (int i = 0; i < n; i++) {
std::wcout << p.get()[i] << L"\n";
}
}
return 0;
}
Gibt es irgendein Problem in dem obigen Code?
Sie brauchen nicht 'std :: function' für das letzte Beispiel, ich denke: Stateless Lambdas sind konvertierbar zu Funktionszeigern. I.e. 'std :: unique_ptr p (...)' –
MSalters
@ MSalters Ich habe das versucht, aber es konnte nicht unter VC10 und g ++ 4.6.2 kompiliert werden. Die erste Fehlermeldung lautet 'Fehler C2664: 'std :: unique_ptr <_Ty,_Dx> :: eindeutige_ptr (wchar_t *, void (__stdcall * const &) (LPWSTR *))': kann Parameter 2 von 'anonymer Namespace' :: 'nicht konvertieren 'void (__stdcall * const &) (LPWSTR *)' ' –
Praetorian
@MSalters Sie haben Recht, Captureless Lambdas können in einen Funktionszeiger umgewandelt werden, so dass 'std :: function' nicht notwendig ist. VC10 [implementiert dies jedoch nicht] (https://connect.microsoft.com/VisualStudio/feedback/details/572138).Ich weiß nicht, wie ich es vermasselt habe, als ich das erste Mal mit g ++ versuchte, aber es funktioniert definitiv. – Praetorian