指针与C中的句柄(用于传达单独事物的术语?)

Set*_*jmp 21 c windows pointers handle

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

我指的白皮书是:Duff,Heroux和Pozo.稀疏基本线性代数子程序概述:BLAS技术论坛的新标准.ACM Transactions on Mathematical Software,Vol 28,No.2,June 2002,Pages 239-267.

Tim*_*ter 45

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

  • 实际上在NT上,HANDLE类型是一个值,它包含在每个进程句柄表中,它将句柄值映射到内核内存中的指针,它不是实际的指针值. (4认同)
  • 很好的答案。对于我们所有 Posix 人来说,文件描述符是句柄的一个很好的例子。 (2认同)

Mor*_*hai 18

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

一个cookie是一回事.或GUID.或者从停车场取回车辆的车票,或者从高档餐厅取回你的外套等.

它呈现给发行人时的任何独特价值可用于追踪发行人想要的任何不透明机制所引用的实际事物. 您可能会或可能不会知道有关该过程的任何信息,也不知道基本信息是什么(仅在概念上).

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

通常不会使用"handle"来表示"指向struct的指针".句柄更像是"令牌",而不像"指针".它指的是某些东西 - 文件,系统资源,内存,状态快照等.但它究竟是什么 -基于句柄本身的上下文(即谁发出句柄).

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

  • 句柄的主要问题是它们往往没有足够的类型信息.即它们通常是一个int或类似的(unsigned),很容易被滥用.并且人们常常做出(可疑的)假设,即零是一个神奇的非手柄值,就好像它是符合C的指针一样.因此,纯粹根据我作为Windows平台上的C++程序员的经验,我看到很少使用句柄的新API(如果有的话).相反,我看到很多对象.句柄的概念仍然有效:您只需使用某些东西来表示它是类型唯一的以避免滥用. (2认同)

Mar*_*ers 13

我使用单词handle来表示指向表示资源的"对象"的指针 - 通常是OS资源,而指针只指向某个内存.如果你有一个东西的句柄,你不应该尝试直接读取和写入字节,但通过提供的方法操纵它.

通常句柄被实现为不透明void *,这进一步鼓励不要试图直接取消引用它.

  • 实际上,它们被称为"不透明指针" (2认同)

Gre*_*ill 10

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

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

随着Win32的引入,CPU具有硬件内存管理器,内存句柄的概念已经过时.其他类型的句柄(如文件句柄和窗口句柄)仍存在于Win32中,但不是指向结构的指针.