gpt4 book ai didi

c++ - std::unique_ptr 带有用于 win32 LocalFree 的自定义删除器

转载 作者:IT老高 更新时间:2023-10-28 22:26:52 24 4
gpt4 key购买 nike

我有 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 the LocalFree 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com