Mat*_*lin 95
句柄可以是从整数索引到指向内核空间中的资源的指针.这个想法是它们提供了资源的抽象,因此您不需要了解资源本身就可以使用它.
例如,Win32 API中的HWND是Window的句柄.它本身就没用了:你无法收集它的任何信息.但是将它传递给正确的API函数,你可以用它执行大量不同的技巧.在内部,您可以将HWND视为GUI窗口表的索引(可能不一定是它的实现方式,但它使魔术变得有意义).
编辑:不是100%肯定你在问题中具体询问的是什么.这主要是谈论纯C/C++.
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
句柄是一种指针,因为它通常是一种引用某个实体的方式.
说一个指针是一种类型的句柄会更准确,但并非所有句柄都是指针.
例如,句柄也可以是内存表中的一些索引,其对应于本身包含指向某个对象的指针的条目.
关键的一点是,当你有一个"把柄",你不知道,也不关心是如何处理实际上结束了识别其所标识的东西,所有你需要知道的是,它的作用.
同样显而易见的是,对于"究竟是什么样的句柄"没有单一的答案,因为即使在同一系统中,对不同事物的处理也可以在"引擎盖下"以不同的方式实现.但你不应该担心这些差异.
在C++/CLI中,句柄是指向位于GC堆上的对象的指针.在(非托管)C++堆上创建对象是使用new并且new表达式的结果是"普通"指针.使用gcnew表达式在GC(托管)堆上分配托管对象.结果将是一个句柄.你不能在句柄上做指针运算.你没有释放句柄.GC会照顾他们.此外,GC可以自由地重新定位托管堆上的对象,并在程序运行时更新句柄以指向新位置.
这出现在Handle-Body-Idiom的背景下,也称为Pimpl习语.它允许通过将实际数据保存到另一个类对象中来保持库的ABI(二进制接口)相同,该对象仅由"句柄"对象中保存的指针引用,该指针由委托给该类的函数组成.身体".
启用两个对象的常量时间和异常安全交换也很有用.为此,只需要交换指向body对象的指针.