- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我有 win32 API CommandLineToArgvW
它返回一个 LPWSTR*
和警告我
CommandLineToArgvW
allocates a block of contiguous memory for pointers to the argument strings, and for the argument strings themselves; the calling application must free the memory used by the argument list when it is no longer needed. To free the memory, use a single call to theLocalFree
function.
看 http://msdn.microsoft.com/en-us/library/windows/desktop/bb776391(v=vs.85).aspx
在上述情况下释放内存的 C++ 惯用方法是什么?
我在想一个带有自定义删除器的 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;
}
上面的代码有问题吗?
最佳答案
在我看来是正确的。您可以通过内联指定 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 ); } );
注意:在首次编写此答案时,VS2010 是可用的已发布 VS 版本。它doesn't support将无捕获 lambda 转换为函数指针,因此您必须在第二个示例中使用 std::function
std::unique_ptr<LPWSTR, std::function<void(LPWSTR *)>>
p( ::CommandLineToArgvW( L"cmd.exe p1 p2 p3", &n ),
[](LPWSTR *ptr){ ::LocalFree( ptr ); } );
关于c++ - std::unique_ptr 带有用于 win32 LocalFree 的自定义删除器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9893093/
我有这段代码 HLOCAL localHandle; char *lpText; localHandle = LocalAlloc(LMEM_MOVEABLE, 40); if(localHandle
我正在调用 GetNamedSecurityInfo()如下: PSID pSID = NULL; PSECURITY_DESCRIPTOR pSD = NULL; // Retrieve the o
我有 win32 API CommandLineToArgvW 它返回一个 LPWSTR* 和警告我 CommandLineToArgvW allocates a block of contiguou
来自 MSDN (格式消息函数): Windows 10: LocalFree is not in the modern SDK, so it cannot be used to free the r
我是一名优秀的程序员,十分优秀!