对我来说这看起来是正确的。您可以通过指定来使其更加简洁unique_ptr
的删除器内联而不是为其创建函子。
std::unique_ptr<LPWSTR, HLOCAL(__stdcall *)(HLOCAL)>
p( ::CommandLineToArgvW( L"cmd.exe p1 p2 p3", &n ), ::LocalFree );
或者,如果你不想惹麻烦LocalFree
的签名和调用约定,您可以使用 lambda 来进行删除。
std::unique_ptr<LPWSTR, void(*)(LPWSTR *)>
p( ::CommandLineToArgvW( L"cmd.exe p1 p2 p3", &n ),
[](LPWSTR *ptr){ ::LocalFree( ptr ); } );
Note:在第一次写这个答案时,VS2010 是可用的已发布 VS 版本。它不支持 https://stackoverflow.com/a/3321822/241631将无捕获的 lambda 转换为函数指针,因此您必须使用std::function
在第二个例子中
std::unique_ptr<LPWSTR, std::function<void(LPWSTR *)>>
p( ::CommandLineToArgvW( L"cmd.exe p1 p2 p3", &n ),
[](LPWSTR *ptr){ ::LocalFree( ptr ); } );