【问题标题】:What exactly is "handle"?“句柄”究竟是什么?
【发布时间】:2011-04-06 22:25:33
【问题描述】:

我经常听说“句柄”,它们到底是什么?

编辑: 例如,我听说过: 窗户把手 事件句柄 文件句柄

等等。那些东西都一样吗?或者它们是一些抽象的术语?

【问题讨论】:

标签: terminology handle


【解决方案1】:

句柄是指向非托管资源的指针,如文件句柄、数据库连接句柄、窗口句柄等...因为它们在大多数情况下是非托管资源的句柄,它们不会被自动垃圾收集,您需要确保正确释放或者您可能会听说手柄泄漏

【讨论】:

  • +1 在 Windows 操作系统中,它们通常是 2 字节的整数,而在托管代码中,您可以使用 IntPtr。
  • 它们不一定是指针,尽管它们可以是。它们是不透明的标识符。
【解决方案2】:

“句柄”是对资源的引用的另一个名称,该资源由程序员显式管理,而不是由运行时自动管理。

【讨论】:

    【解决方案3】:

    句柄是引用操作系统或库拥有的对象的间接方式。当操作系统或库拥有一个对象但想让客户端引用它时,它可以提供对该对象的引用,称为句柄。

    句柄可以以不同的方式实现。通常它们不是 C++ 或 C# 意义上的引用。通常它们是指向某些不透明类型的指针,或者它们可能是(或包含)操作系统或库拥有的对象表的索引。

    例如,在 Windows 中,如果您创建一个窗口,操作系统会创建一个表示该窗口的对象,但它不会返回指向该对象的指针。相反,它返回一个窗口句柄,它提供了一个额外的间接层。当您在另一个操作系统调用中将窗口句柄传回时,操作系统会根据句柄知道要使用哪个窗口对象。这可以防止您的代码直接访问窗口对象。

    额外的间接层允许操作系统或库执行诸如移动对象、引用计数对象以及通常控制对象发生的事情等事情。与 PIMPL 习惯用法一样,实现可能会完全改变,同时仍保留原始 API,因此不会强制客户端重新编译。如果您尝试为使用 C 等过程语言编写的客户端提供非面向对象的 API,它会特别有用。

    【讨论】:

      猜你喜欢
      • 2014-10-28
      • 2012-08-27
      • 2010-11-12
      • 2011-03-18
      • 2011-01-22
      • 1970-01-01
      相关资源
      最近更新 更多