c – 移动语义和窗口句柄. DeleteObject安全句柄?
Windows中是否存在某种NULL句柄?如果我通过CreateCompatibleBitmap()创建一个bmp并通过DeleteObject()删除它并想要使用移动语义,我想确保不破坏位图.因此,我必须将HBITMAP设置为可安全删除的值.比如删除nullptr.
解决方法
首先是坏消息.由于历史原因,Windows API中通常没有有效的“无效句柄”值. Windows中的不同子系统将NULL或INVALID_HANDLE_VALUE视为无效句柄值(用于返回无效句柄值和获取句柄值).
Related article on Old New Thing.
然而,好消息是,尽管您仍然需要为意外的返回值做好准备(除非您仔细阅读您使用的每个函数的文档),但提供无效值仍然总是在实践中“起作用”. 因此,继续使用NULL(或nullptr),你很好.如果不出意外,对于稍后阅读您的代码的人来说,这是直观的.在您的具体示例中,它也是正确的,因为GDI函数假定NULL为无效. 您几乎可以依赖NULL和INVALID_HANDLE_VALUE都是无效值.虽然我不知道一个要求(如文档中明确说明的那样)有效的HANDLE必须是非零的,但实际上它们总是如此.我愿意打赌你永远不会找到零值的句柄(只是尝试并使用Sysinternals的句柄工具,你的计算机上的任何一个进程都不会有低于20的句柄). 但即使假设NULL可以是一个有效的句柄值,你也必须考虑到在调用main或运行全局构造函数之前已经打开和关闭了一些句柄,你真的没有选择.这意味着假设NULL可能是一个有效的句柄,并且假设它在程序运行时仍然有效,那么这个假设句柄与API函数兼容的类型的机会非常低. 另一方面,有人可能会争辩说应用程序可能打开(无符号)-1个句柄,使INVALID_HANDLE_VALUE成为有效值. 除非你泄漏手柄,否则我无法想象你会如何获得那么多打开手柄.但更重要的是,在达到该数字之前很久,您可能会在64位系统上耗尽内存,并且您将彻底耗尽32位系统上的地址空间.如果INVALID_HANDLE_VALUE是一个有效的句柄永远成为一个问题,你有一个更严重的问题. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |