gpt4 book ai didi

c++ - 我不知道这个 C++ 单行代码的作用

转载 作者:可可西里 更新时间:2023-11-01 18:09:59 24 4
gpt4 key购买 nike

我在 Github 上发现了一个函数,里面有一个非常奇怪的单行代码:

std::unique_ptr<std::remove_pointer<HANDLE>::type, void(*)(HANDLE)> hDevice{h, [](HANDLE handle){CloseHandle(handle);}};

作为一个从未接触过 c++ 的人,我不知道它的作用。

我想,这里有两个嵌套的匿名函数以某种方式与 std::remove_pointerstd::unique_ptr 调用相连。我在内部函数中看到一个 WinAPI CloseHandle 调用,我想我应该从它开始我的分析。我不能说更多。

这里可能是两个嵌套的泛型。

花括号和“大于”符号的使用对我来说也很奇怪。它打破了我所知道的所有规范案例。

请帮助了解这个集团。我不知道如何用谷歌搜索它的部分。

最佳答案

首先让我们格式化它以使其可读:

std::unique_ptr<std::remove_pointer<HANDLE>::type, void(*)(HANDLE)> hDevice{
h,
[](HANDLE handle) { CloseHandle(handle); }
};

这是一个名为 hDevice 的对象的声明, 用两个参数初始化。一个是 h另一个是 lambda function .我们会回到那个。

对象的类型是std::unique_ptr<std::remove_pointer<HANDLE>::type, void(*)(HANDLE)> . <>意味着这是模板的实例化。有问题的模板是 std::unique_ptr ,一个内存管理的标准组件,一个智能指针。

两件事:

  • std::unique_ptr<T>是一种指向 T 类型对象的指针.
  • std::unique_ptr<T, D>是一种指向 T 类型对象的指针使用 D 类型的自定义“删除器” ;我们会回到那个。

你的 Tstd::remove_pointer<HANDLE>::type . Windows 为我们提供了类型别名 HANDLE 这是一个混淆的指针类型。这个表达式给了我们一个 HANDLE 的东西的类型。指向(并且以一种很好的通用方式执行,不必对结果进行硬编码;微软可以更改 HANDLE 的定义,只要它仍然是一个指针,它就仍然有效)。

你的 Dvoid(*)(HANDLE) .那是函数指针的类型,一个指向取HANDLE的函数的指针。并返回 void .哦,这看起来很眼熟:它是一个函数指针类型,与您作为构造函数参数提供的 lambda 兼容。

那是因为 lambda 自定义删除器。它告诉 unique_ptr当智能指针超出范围时该怎么办。通常那会很好 delete ,但这里我们有一个 Windows API 函数 ( CloseHandle ) 可以调用,它会为我们做清理工作。这可能涉及 delete和其他事情,或者它可能只涉及其他事情。重点是这是关闭 HANDLE 的正确方法.

总的来说,这个声明创建了一个 std::unique_ptr 拥有 HANDLE h ,并确保 CloseHandle(h)std::unique_ptr 时调用超出范围。

tl;dr:这是一种添加 RAII 的方法到 Windows 句柄。

关于c++ - 我不知道这个 C++ 单行代码的作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57272748/

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