私はLPWSTR*
を返し、 がのstd :: win32のLocalFreeのカスタム削除手段とunique_ptrを
CommandLineToArgvW
は、引数文字列に のポインタのための連続したメモリのブロックを割り当てていることを私に警告したWin32 APICommandLineToArgvW
を持っている、と引数の文字列は です。呼び出し元のアプリケーションは、不要になったときに、 引数リストで使用されるメモリを解放する必要があります。メモリを解放するには、LocalFree
ファンクションへの単一コールを で呼び出します。
を参照してください http://msdn.microsoft.com/en-us/library/windows/desktop/bb776391(v=vs.85).aspx
C++上記の場合のメモリを解放する慣用的な方法は何ですか?
#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::unique_ptr
にそのようなことを考えていましたか?
最後の例で 'std :: function'は必要ありません。私は考える:ステートレスラムダは関数ポインタに変換可能です。私。 – MSalters
@MSalters私はそれを試みましたが、VC10とg ++ 4.6.2でコンパイルできませんでした。 '匿名 - 名前空間' :: 'からのパラメータ2を変換できません: 'void(__stdcall * const&)(LPWSTR *)' ' –
Praetorian
@MSalters正しいキャプチャのないlambdaは関数ポインタに変換できるので、 'std :: function'は必要ありません。しかし、VC10はこれを実装していません(https://connect.microsoft.com/VisualStudio/feedback/details/572138)。私がg ++で初めて試したときにどうしたのか分かりませんが、間違いなく動作します。 – Praetorian