加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 移动语义和窗口句柄. DeleteObject安全句柄?

发布时间:2020-12-16 07:02:43 所属栏目:百科 来源:网络整理
导读:Windows中是否存在某种NULL句柄?如果我通过CreateCompatibleBitmap()创建一个bmp并通过DeleteObject()删除它并想要使用移动语义,我想确保不破坏位图.因此,我必须将HBITMAP设置为可安全删除的值.比如删除nullptr. 解决方法 首先是坏消息.由于历史原因,Window
Windows中是否存在某种NULL句柄?如果我通过CreateCompatibleBitmap()创建一个bmp并通过DeleteObject()删除它并想要使用移动语义,我想确保不破坏位图.因此,我必须将HBITMAP设置为可安全删除的值.比如删除nullptr.

解决方法

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

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

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

您几乎可以依赖NULL和INVALID_HANDLE_VALUE都是无效值.虽然我不知道一个要求(如文档中明确说明的那样)有效的HANDLE必须是非零的,但实际上它们总是如此.我愿意打赌你永远不会找到零值的句柄(只是尝试并使用Sysinternals的句柄工具,你的计算机上的任何一个进程都不会有低于20的句柄).

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

另一方面,有人可能会争辩说应用程序可能打开(无符号)-1个句柄,使INVALID_HANDLE_VALUE成为有效值.

除非你泄漏手柄,否则我无法想象你会如何获得那么多打开手柄.但更重要的是,在达到该数字之前很久,您可能会在64位系统上耗尽内存,并且您将彻底耗尽32位系统上的地址空间.如果INVALID_HANDLE_VALUE是一个有效的句柄永远成为一个问题,你有一个更严重的问题.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读