Это выглядит правильно для меня. Вы можете сделать его более лаконичным, указав встроенное средство удаления unique_ptr
вместо создания функтора для него.
std::unique_ptr<LPWSTR, HLOCAL(__stdcall *)(HLOCAL)>
p( ::CommandLineToArgvW( L"cmd.exe p1 p2 p3", &n ), ::LocalFree );
Или, если вы не хотите связываться с подписью и соглашениями о вызовах LocalFree
, вы можете использовать лямбду для удаления.
std::unique_ptr<LPWSTR, void(*)(LPWSTR *)>
p( ::CommandLineToArgvW( L"cmd.exe p1 p2 p3", &n ),
[](LPWSTR *ptr){ ::LocalFree( ptr ); } );
Примечание: На момент написания этого ответа VS2010 была выпущенной версией VS. не поддерживает преобразование лямбд без захвата в указатели функций, поэтому вам придется использовать std::function
во втором примере
std::unique_ptr<LPWSTR, std::function<void(LPWSTR *)>>
p( ::CommandLineToArgvW( L"cmd.exe p1 p2 p3", &n ),
[](LPWSTR *ptr){ ::LocalFree( ptr ); } );