Answers:
句柄可以是任何值,从整数索引到内核空间中资源的指针。这个想法是,它们提供了资源的抽象,因此您无需了解有关资源本身的任何知识即可使用它。
例如,Win32 API中的HWND是Window的句柄。就其本身而言,它是无用的:您无法从中收集任何信息。但是将其传递给正确的API函数,您可以使用它执行许多不同的技巧。在内部,您可以将HWND视为GUI窗口表的索引(可能不一定是其实现方式,但这很有意义)。
编辑:不能100%肯定您在问什么。这主要是在谈论纯C / C ++。
句柄是没有可见类型的指针或索引。通常,您会看到类似以下内容的内容:
typedef void* HANDLE;
HANDLE myHandleToSomething = CreateSomething();
因此,在您的代码中,您只需将HANDLE作为不透明的值传递即可。
在使用该对象的代码中,它将指针转换为实际的结构类型并使用它:
int doSomething(HANDLE s, int a, int b) {
Something* something = reinterpret_cast<Something*>(s);
return something->doit(a, b);
}
或将其用作数组/向量的索引:
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);
}
}
在C ++ / CLI中,句柄是指向位于GC堆上的对象的指针。通过使用(在非托管的)C ++堆上创建对象可以实现,new
并且new
表达式的结果是“普通”指针。使用gcnew
表达式在GC(托管)堆上分配托管对象。结果将是一个句柄。您不能对句柄执行指针运算。您没有释放把手。GC将照顾他们。此外,GC可以自由地在托管堆上重定位对象,并在程序运行时更新句柄以指向新位置。
这出现在Handle-Body-Idiom(也称为Pimpl惯用语)的上下文中。通过将实际数据保存到另一个类对象中,该类库可以使库的ABI(二进制接口)保持相同,该类对象仅由“句柄”对象中包含的指针引用,该指针由代表该类的函数组成。身体”。
启用两个对象的恒定时间和异常安全交换也很有用。为此,仅需交换指向主体对象的指针。