Ho API Win32 CommandLineToArgvW
che restituisce un LPWSTR*
e mi avverte chestd :: unique_ptr con deleter personalizzato per win32 LocalFree
CommandLineToArgvW
alloca un blocco di memoria contigua per puntatori alle corde argomento, e per le stringhe argomento ; l'applicazione chiamante deve liberare la memoria utilizzata dall'elenco degli argomenti quando non è più necessaria. Per liberare la memoria, utilizzare una singola chiamata alla funzioneLocalFree
.
Vedi http://msdn.microsoft.com/en-us/library/windows/desktop/bb776391(v=vs.85).aspx
Che è un C++ modo idiomatico per liberare la memoria nel caso di cui sopra?
Stavo pensando ad un std::unique_ptr
con un deleter personalizzato, qualcosa di simile:
#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;
}
C'è qualche problema nel codice di cui sopra?
Non è necessario 'std :: function' per l'ultimo esempio, penso: i lambda stateless sono convertibili in puntatori di funzione. Cioè 'Std :: unique_ptr p (...)' –
MSalters
@MSalters ho provato questo, ma non è riuscito a compilare sotto VC10 e g ++ 4.6.2. messaggio di errore del primo è 'l'errore C2664: 'std :: :: unique_ptr <_Ty,_Dx> unique_ptr (wchar_t *, void (__stdcall * const &) (LPWSTR *))': non può convertire il parametro 2 da 'anonymous-namespace' :: ' a 'void (__stdcall * const &) (LPWSTR *)' ' –
Praetorian
@MSalters Lei ha ragione, lambda captureless può essere convertito in un puntatore a funzione, in modo da' std :: function' non è necessario. Tuttavia, VC10 [non implementa questo] (https://connect.microsoft.com/VisualStudio/feedback/details/572138).Non so come l'ho incasinato la prima volta che ho provato con g ++ ma sicuramente funziona. – Praetorian