gpt4 book ai didi

c++ - move 语义和窗口句柄。 DeleteObject 安全句柄?

转载 作者:可可西里 更新时间:2023-11-01 14:25:19 25 4
gpt4 key购买 nike

Windows 中是否存在某种 NULL 句柄?如果我通过 CreateCompatibleBitmap() 创建一个 bmp 并通过 DeleteObject() 删除它并且想要使用 move 语义,我想确保位图没有被破坏。因此,我必须将 HBITMAP 设置为可以安全删除的值。比如delete nullptr

最佳答案

首先是坏消息。由于历史原因,Windows API 中没有普遍有效的“无效句柄”值。 Windows 中的不同子系统将 NULLINVALID_HANDLE_VALUE 视为无效句柄值(用于返回无效句柄值和获取无效句柄值)。 Related article on Old New Thing .

然而,好消息是,尽管您仍然需要为意外的返回值做好准备(除非您仔细阅读您使用的每个函数的文档),但仍然总是提供无效值“在实践中有效。
您可能没有使用正确指定的“无效”值,但它仍然无效,因此函数将失败。您的应用程序不会崩溃,除了浪费几个 CPU 周期外没有任何负面影响。

因此,继续使用 NULL(或 nullptr),你会很擅长的。如果不出意外,这对于稍后阅读您的代码的人来说是直观的。在您的具体示例中,它也是正确的,因为 GDI 函数假定 NULL 为无效。

您几乎可以相信 NULLINVALID_HANDLE_VALUE 都是无效值。尽管我不知道有效的 HANDLE 必须为非零的要求(如文档中明确说明的那样),但实际上它们总是如此。我敢打赌你永远找不到值为零的句柄(只要尝试使用 Sysinternals 的 handle 工具,你的计算机上没有一个进程的句柄可能低于 20) .

但即使假设 NULL 可以是一个有效的句柄值,您也必须考虑一些句柄甚至在 main 被调用或全局构造函数被调用之前就已经打开和关闭了跑,你真的别无选择。这意味着假设 NULL 可能是一个有效的句柄,并且假设它在您的程序运行时仍然有效,那么这个假设的句柄偶然属于与 API 函数兼容的类型的可能性非常低.

另一方面,有人可能会争辩说应用程序可能有 (unsigned) -1 句柄打开,呈现 INVALID_HANDLE_VALUE 有效 值.

除非您正在泄漏句柄,否则我无法想象您如何获得那么多打开的句柄。但更重要的是,在达到该数字之前很久,您可能会在 64 位系统上用完内存,而在 32 位系统上您肯定会用完地址空间。
如果 INVALID_HANDLE_VALUE 成为一个有效句柄成为一个问题,那么您的问题就严重得多。

关于c++ - move 语义和窗口句柄。 DeleteObject 安全句柄?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13831200/

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