24

最近,我阅读了一个人的白皮书,他将指向结构的指针称为句柄。作者显然是之前在windows平台上写过C代码的人。谷歌搜索表明 Windows 程序员通过句柄与系统组件交互。我想知道 Windows 程序员将所有结构指针都称为句柄是否是常见的做法?或者句柄一词是否意味着传达超出结构指针的东西?我问的是一个 linux C 程序员。

我指的白皮书是:Duff、Heroux 和 Pozo。稀疏基本线性代数子程序概述:BLAS 技术论坛的新标准。ACM Transactions on Mathematical Software,第 28 卷,第 2 期,2002 年 6 月,第 239-267 页。

4

16 回答 16

49

术语句柄通常表示一些仅对生成它的 API 有意义的不透明值。在 Win32 中,HANDLE 类型要么是内核内存中的指针(应用程序无论如何都无法访问),要么是某个内核内部数组的索引。

于 2009-12-17T18:23:09.667 回答
22

手柄是一个古老而受人尊敬的概念。

cookie 几乎是一样的东西。或 GUID。或者从停车场取回汽车的票,或者从高档餐厅取回你的外套等。

它的任何唯一值在返回给发行人时可用于通过发行人想要的任何不透明机制来追踪所引用的实际事物。 你可能知道也可能不知道这个过程,也不知道底层的东西是什么,确切地说(仅在概念上)。

它被 Windows 大量使用,但它肯定不是 Windows 独有的。

您通常不会使用“句柄”来表示“指向结构的指针”。句柄更像是“令牌”而不是“指针”。它指的是一些东西——文件、系统资源、内存、状态快照等。但究竟是什么是基于句柄本身的上下文(即谁发出句柄)。

在 K&R C 的早期文件系统编程中也大量使用了句柄。

于 2009-12-17T18:26:00.103 回答
13

我使用句柄这个词来表示指向代表资源的“对象”的指针——通常是操作系统资源,而指针只是指向一些内存。如果您有某个东西的句柄,则不应尝试直接对其进行读写字节,而应通过提供的方法对其进行操作。

句柄通常被实现为 opaque void *,这进一步鼓励不要尝试直接取消引用它。

于 2009-12-17T18:21:03.977 回答
10

由于您将句柄用作指向结构的指针,就像 Windows 程序员使用的那样,我将在该上下文中回答。请注意,显然有许多不同种类的“句柄”,因为它是计算环境中广泛使用的通用概念。当然你会熟悉文件句柄的概念;Windows 还提供窗口句柄和许多其他类型的句柄。话说回来:

“内存句柄”(类似于指向结构的指针)是 16 位 Windows 编程领域的一个概念,其中 CPU 中没有内存管理器,所有内存管理都必须在软件中完成。本质上,“句柄”是一种指针,但操作系统可以自由地在句柄所指的内存中移动。您不能使用常规指针来执行此操作,但句柄具有可以获取和释放实际内存地址的函数。

随着 Win32 的引入,CPU 有一个硬件内存管理器,内存句柄的概念变得过时了。Win32 中仍然存在其他类型的句柄,例如文件句柄和窗口句柄,但不是指向结构的指针。

于 2009-12-17T18:20:12.997 回答
3

术语句柄用于表示允许您访问另一个对象的任何技术。句柄可以是指针、引用、指向指针的指针等。但确定它与类、对象等有关。因此句柄不必总是指向结构的指针。

-广告。

于 2009-12-17T18:24:07.800 回答
3

“句柄”一词并非起源于 Windows,尽管它在 Windows 程序员中很普遍。

在 C 标准库 (stdio.h) 中,文件句柄是指向 C 库使用的数据结构的指针。

纯 Unix 编程使用文件描述符,它是内核数据结构的索引,但指针在 Unix 中被用作句柄已超过 30 年。

于 2009-12-17T18:27:14.760 回答
3

“句柄”是一个逻辑术语,而不是物理术语。它意味着作为物理对象的代理,以更深入地了解对象的代码。指向结构的指针就是这样一种代理,但还有许多其他可能性。

于 2009-12-17T18:30:58.660 回答
2

不,在 Windows 程序员中将指针称为句柄并不是特别常见,但这样做也不是错误的。术语“句柄”通常用于描述您用来访问某些东西的东西,从这个意义上说,都是指针句柄(但并非所有句柄都是指针)。Win32 的句柄通常不是指针,而是内部 OS 表的索引,但在 Windows 的未来版本中可能会发生变化。

于 2009-12-17T18:25:18.120 回答
2

在过去的 MacOS 编程时代,早在 OSX 之前,句柄就是指向指针的指针。这允许操作系统在不使用户指针无效的情况下移动事物。关于我们何时可以假设指向的对象不会移动的规则,我不记得了。

于 2009-12-17T18:26:29.120 回答
2

句柄是对对象的引用(不是特别是 C++ 引用)的通用术语。

指针句柄的子集,因为它指向对象。

数据库中的外键也是句柄,因为它指向其他表中的记录;它不是一个指针。

在 Windows API 环境中,他们使用抽象术语句柄,因此他们可以将整数用于表、指针或其他方法,而不会干扰客户端;IOW,定义一个抽象接口。

总之,句柄可以是指针以外的东西,例如整数索引或包含有关对象的更多详细信息的对象(例如智能指针)。

于 2009-12-17T18:30:19.550 回答
1

Windows 定义了许多事物的句柄。它们根本不一定是指针——有些是指针,但有些是特定表的偏移量。有一些是故意混淆的。从窗口到设备上下文再到位图等等,都有句柄。

在任何情况下,句柄通常是作为一种不透明的数据类型来设计的——也就是说,你不应该知道任何关于它的值的东西,只知道一组可以使用它来完成各种任务的预定义操作。我相信 C++/CLI 也有一个类似指针的对象,称为句柄。我相信它应该更接近于不透明的数据类型——如果内存服务,你不能对它们进行任何指针运算。

于 2009-12-17T18:24:47.760 回答
1

我可能比大多数受访者年长,在早期(80 年代后期)Macintosh 和 16 位和 32 位 Windows 上都以 C 语言为生。在那些远古时代(IBM 大型机可能只有 256k 内存),句柄始终是指向内存指针的指针(或表偏移量)。

正如之前的一位受访者所提到的,这允许操作系统管理指向内存块的指针表,而不会使程序员使用的“句柄”无效。不幸的是,我不记得我们如何保证在使用句柄时不会移动分配的块。

于 2012-12-18T19:33:35.287 回答
1

句柄通常是您不需要直接取消引用的指针。而是将它们传递给对底层结构进行操作的 API 调用。

从历史上看,在 Windows 上,句柄不是指针。您可以在使用前锁定手柄以获取指针,并在完成后解锁(指针将变为无效)。在分页内存之前的日子里,老式的 Windows 通过交换仅由句柄引用的资源并在它们被锁定时将它们交换回来来进行自己的内存管理。实际上,这使内存管理成为一场噩梦,但允许 Windows 在没有硬件支持的情况下模拟系统上的虚拟内存。

于 2009-12-17T18:25:51.520 回答
1

实际上,指针是包含另一个变量地址的变量,但句柄是指向指针的指针,即包含另一个指针地址的指针 FOR EX:

int x=10;

int *a=&x;// this is a simple pointer

int *b=a;// this is a handle
于 2013-01-30T12:49:08.770 回答
0

指针绝对不同于句柄。指针是内存中未指定的地址。指向结构的指针可以称为“句柄”(通常使用“typedef”)。

句柄是编写 Windows 操作系统时使用的概念。指针是 C 语言的一部分。

于 2009-12-17T18:22:58.207 回答
0

句柄是一个数字,指针不是句柄

// storage
char data[0xFFFF] = {0} ;

// pointer aka "iterator"
char * storage_pointer = & data[42];

// handle
size_t storage_handle = 42 ;

关键区别或者如果您更喜欢将其称为句柄的“优势”,则可以尝试推断句柄是否有效,或者您是否更喜欢术语“悬空”。

只要可行,我都会使用句柄。这是一篇关于优势和实施实践的好文章。

于 2021-01-18T07:31:48.113 回答