【发布时间】:2011-04-06 22:25:33
【问题描述】:
我经常听说“句柄”,它们到底是什么?
编辑: 例如,我听说过: 窗户把手 事件句柄 文件句柄
等等。那些东西都一样吗?或者它们是一些抽象的术语?
【问题讨论】:
-
您听到这个词的背景是什么?这是一个非常笼统的术语,具有多种含义。
标签: terminology handle
我经常听说“句柄”,它们到底是什么?
编辑: 例如,我听说过: 窗户把手 事件句柄 文件句柄
等等。那些东西都一样吗?或者它们是一些抽象的术语?
【问题讨论】:
标签: terminology handle
句柄是指向非托管资源的指针,如文件句柄、数据库连接句柄、窗口句柄等...因为它们在大多数情况下是非托管资源的句柄,它们不会被自动垃圾收集,您需要确保正确释放或者您可能会听说手柄泄漏。
【讨论】:
“句柄”是对资源的引用的另一个名称,该资源由程序员显式管理,而不是由运行时自动管理。
【讨论】:
句柄是引用操作系统或库拥有的对象的间接方式。当操作系统或库拥有一个对象但想让客户端引用它时,它可以提供对该对象的引用,称为句柄。
句柄可以以不同的方式实现。通常它们不是 C++ 或 C# 意义上的引用。通常它们是指向某些不透明类型的指针,或者它们可能是(或包含)操作系统或库拥有的对象表的索引。
例如,在 Windows 中,如果您创建一个窗口,操作系统会创建一个表示该窗口的对象,但它不会返回指向该对象的指针。相反,它返回一个窗口句柄,它提供了一个额外的间接层。当您在另一个操作系统调用中将窗口句柄传回时,操作系统会根据句柄知道要使用哪个窗口对象。这可以防止您的代码直接访问窗口对象。
额外的间接层允许操作系统或库执行诸如移动对象、引用计数对象以及通常控制对象发生的事情等事情。与 PIMPL 习惯用法一样,实现可能会完全改变,同时仍保留原始 API,因此不会强制客户端重新编译。如果您尝试为使用 C 等过程语言编写的客户端提供非面向对象的 API,它会特别有用。
【讨论】: