tengo la API de Win32 CommandLineToArgvW
que devuelve un LPWSTR*
y me advierte questd :: unique_ptr con Deleter personalizado para LocalFree Win32
CommandLineToArgvW
asigna un bloque de memoria contigua para punteros a las cadenas de argumentos, y para las cadenas de argumentos ellos mismos; la aplicación de llamada debe liberar la memoria utilizada por la lista de argumentos cuando ya no sea necesaria. Para liberar la memoria, use una llamada única a la funciónLocalFree
.
Ver http://msdn.microsoft.com/en-us/library/windows/desktop/bb776391(v=vs.85).aspx
¿Qué es un C++ forma idiomática para liberar la memoria en el caso anterior?
yo estaba pensando a un std::unique_ptr
con un Deleter costumbre, algo así:
#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;
}
¿Hay algún problema en el código anterior?
No necesita 'std :: function' para el último ejemplo, creo: los lambda sin estado son convertibles en punteros a funciones. Es decir. 'Std :: unique_ptr p (...)' –
MSalters
@MSalters Yo probé eso, pero no lograron compilar bajo VC10 y g ++ 4.6.2. mensaje de error de los primeros es 'C2664 de error: 'std :: :: unique_ptr <_Ty,_Dx> unique_ptr (wchar_t *, void (* const __stdcall Y) (LPWSTR *))': no se puede convertir el parámetro 2 de 'anonymous-espacio de nombres' :: ' a 'void (* const __stdcall y) (LPWSTR *)' ' –
Praetorian
@MSalters Estás en lo correcto, lambdas captureless se pueden convertir a un puntero de función, por lo que' std :: function' no es necesario. Sin embargo, VC10 [no implementa esto] (https://connect.microsoft.com/VisualStudio/feedback/details/572138).No sé cómo lo estropeé la primera vez que probé con g ++, pero definitivamente funciona. – Praetorian