什么是C++中的句柄?

Xen*_*ate 93 c++ handle

我被告知句柄是一种指针,但不是,并且它允许您保持对对象的引用,而不是对象本身.什么是更详细的解释?

Mat*_*lin 95

句柄可以是从整数索引到指向内核空间中的资源的指针.这个想法是它们提供了资源的抽象,因此您不需要了解资源本身就可以使用它.

例如,Win32 API中的HWND是Window的句柄.它本身就没用了:你无法收集它的任何信息.但是将它传递给正确的API函数,你可以用它执行大量不同的技巧.在内部,您可以将HWND视为GUI窗口表的索引(可能不一定是它的实现方式,但它使魔术变得有意义).

编辑:不是100%肯定你在问题中具体询问的是什么.这主要是谈论纯C/C++.

  • 句柄可用于保存状态(以及其他).如果你有像std :: vector这样的结构中的数据.在执行程序期间,您的对象可能位于不同的内存位置,这意味着指向该内存的指针将更改值.使用句柄它永远不会改变,它总是引用你的对象.想象一下保存程序的状态(比如在游戏中) - 你不会将指针位置保存到数据中,然后再次导入数据并尝试在内存中获取该地址.但是,您可以使用数据保存Handle,并导入数据和句柄. (12认同)

jmu*_*llo 47

句柄是一个没有可见类型的指针或索引.通常你会看到类似的东西:

 typedef void* HANDLE;
 HANDLE myHandleToSomething = CreateSomething();
Run Code Online (Sandbox Code Playgroud)

因此,在您的代码中,您只需将HANDLE作为不透明值传递.

在使用该对象的代码中,它将指针强制转换为实际结构类型并使用它:

 int doSomething(HANDLE s, int a, int b) {
     Something* something = reinterpret_cast<Something*>(s);
     return something->doit(a, b);
 }
Run Code Online (Sandbox Code Playgroud)

或者它将它用作数组/向量的索引:

 int doSomething(HANDLE s, int a, int b) {
     int index = (int)s;
     try {
         Something& something = vecSomething[index];
         return something.doit(a, b);
     } catch (boundscheck& e) {
         throw SomethingException(INVALID_HANDLE);
     }
 }
Run Code Online (Sandbox Code Playgroud)


Del*_*ics 27

句柄一种指针,因为它通常是一种引用某个实体的方式.

说一个指针是一种类型的句柄会更准确,但并非所有句柄都是指针.

例如,句柄也可以是内存表中的一些索引,其对应于本身包含指向某个对象的指针的条目.

关键的一点是,当你有一个"把柄",你不知道,也不关心是如何处理实际上结束了识别其所标识的东西,所有你需要知道的是,它的作用.

同样显而易见的是,对于"究竟是什么样的句柄"没有单一的答案,因为即使在同一系统中,对不同事物的处理也可以在"引擎盖下"以不同的方式实现.但你不应该担心这些差异.

  • 您的答案补充了这一个/sf/answers/134655251/ (3认同)

Meh*_*ari 5

在C++/CLI中,句柄是指向位于GC堆上的对象的指针.在(非托管)C++堆上创建对象是使用new并且new表达式的结果是"普通"指针.使用gcnew表达式在GC(托管)堆上分配托管对象.结果将是一个句柄.你不能在句柄上做指针运算.你没有释放句柄.GC会照顾他们.此外,GC可以自由地重新定位托管堆上的对象,并在程序运行时更新句柄以指向新位置.


Joh*_*itb 5

这出现在Handle-Body-Idiom的背景下,也称为Pimpl习语.它允许通过将实际数据保存到另一个类对象中来保持库的ABI(二进制接口)相同,该对象仅由"句柄"对象中保存的指针引用,该指针由委托给该类的函数组成.身体".

启用两个对象的常量时间和异常安全交换也很有用.为此,只需要交换指向body对象的指针.