什么是在C + +的句柄?
我被告知句柄是一种指针,但不是,它允许你保持一个对象的引用,而不是对象本身。 什么是更详细的解释?
句柄可以是从整数索引到指向内核空间资源的指针。 这个想法是,他们提供了一个资源的抽象,所以你不需要知道多less资源本身来使用它。
例如,Win32 API中的HWND是一个Window的句柄。 它本身是无用的:你不能从中收集任何信息。 但是把它传递给正确的API函数,你可以用它来执行大量不同的技巧。 在内部,你可以将HWND看作是GUI的窗口表(这可能不一定是如何实现的,但它使魔法变得有意义)的索引。
编辑:不是100%确定你问什么具体问题。 这主要是讲纯C / C ++。
句柄是一个没有可见types的指针或索引。 通常你会看到类似于:
typedef void* HANDLE; HANDLE myHandleToSomething = CreateSomething();
所以在你的代码中,你只需要传递HANDLE作为一个不透明的值。
在使用该对象的代码中,它将指针转换为真实的结构types并使用它:
int doSomething(HANDLE s, int a, int b) { Something* something = reinterpret_cast<Something*>(s); return something->doit(a, b); }
或者它将其用作数组/vector的索引:
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); } }
句柄是一种指针,它通常是引用某个实体的一种方式。
说一个指针是一种types的句柄,但并不是所有的句柄都是指针会更准确些。
例如,句柄也可能是内存表中的一些索引,它对应于其本身包含指向某个对象的指针的条目。
关键在于,当你有一个“处理”时,你既不知道也不关心这个处理过程究竟是如何结束以识别它所识别的东西,所有你需要知道的就是它的确如此。
同样显而易见的是,对于“什么是句柄”没有单一的答案,因为即使在相同的系统中,对不同事物的处理也可能以“不同的方式实施”。 但是你不应该关心这些差异。
这出现在句柄身体成语的背景下,也被称为Pimpl成语。 它允许通过将实际数据保存到另一个类对象来保持库的ABI(二进制接口),该对象仅由“句柄”对象中保存的指针引用,由委托给该类的函数组成“身体”。
启用两个对象的恒定时间和exception安全交换也很有用。 为此,仅仅指向正文对象的指针必须被交换。
在C ++ / CLI中,句柄是位于GC堆上的对象的指针。 在(非托pipe的)C ++堆上创build对象是使用new
实现的, new
expression式的结果是“普通”指针。 使用gcnew
expression式在GC(托pipe)堆上分配托pipe对象。 结果将是一个句柄。 你不能在句柄上做指针运算。 你不能释放手柄。 GC将照顾他们。 此外,GC可以自由地重新定位托pipe堆上的对象,并在程序运行时更新句柄以指向新的位置。
HANDLE hnd; is same as void * ptr;
HANDLE是在visual studio(windows)的winnt.h文件中定义的一个typefed。
ic: typedef void *HANDLE;
阅读关于HANDLE的更多信息
句柄就是你想要的。
句柄可以是一些查找表中使用的无符号整数。
句柄可以是一个指向更大数据集的指针。
这取决于使用该句柄的代码的行为。 这决定了句柄types。
“ 处理 ”一词的使用是重要的。 这表明他们作为对象的标识或访问types。 对程序员来说,它们代表了一个“钥匙” 或者某种东西的存取。