我有一个win32 API的
我考虑使用一个具有自定义删除器的
在上面的代码中有任何问题吗?
CommandLineToArgvW
,它返回一个LPWSTR*
并警告我:
请参见http://msdn.microsoft.com/en-us/library/windows/desktop/bb776391(v=vs.85).aspx 在上述情况下,有没有C++惯用的方法来释放内存?
CommandLineToArgvW
为指向参数字符串的指针和参数字符串本身分配了一块连续的内存块;当不再需要参数列表时,调用应用程序必须释放所使用的内存。要释放内存,请使用单个调用LocalFree
函数。
我考虑使用一个具有自定义删除器的
std::unique_ptr
,类似于这样:#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;
}
在上面的代码中有任何问题吗?
std::function
:无状态lambda可以转换为函数指针。即std::unique_ptr<LPWSTR,void(*)(LPWSTR)>p (...)
- MSalterserror C2664: 'std::unique_ptr<_Ty,_Dx>::unique_ptr(wchar_t *,void (__stdcall *const &)(LPWSTR *))' : cannot convert parameter 2 from 'anonymous-namespace'::<lambda0>' to 'void (__stdcall *const &)(LPWSTR *)'
。 - PraetorianLPWSTR *
有些可疑。LP
是 Microsoft 指针 typedefs 的前缀;很可能你并不想释放指向指针的指针。 - MSaltersLocalFree()
作为删除器,并使用decltype(LocalFree)
作为签名。 - Remy Lebeau