我已被告知,一个手柄样的指针,但没有,它可以让你保持一个参考的对象,而不是对象本身。什么是更详细的解释?

有帮助吗?

解决方案

一个手柄可以是一个整数索引的指针在内核空间中的资源任何东西。我们的想法是,他们提供的资源的抽象,所以你不需要知道很多关于资源本身的使用它。

例如,在Win32 API在HWND为窗口的把手。它本身是无用的:你不能从搜集任何信息。但它传递到相应的API功能,你可以用它进行了大量不同的花样。在内部,你能想到的HWND作为一个索引到Windows的GUI的表(不一定是它是如何实现的,但它使魔是有意义的)。

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

其他提示

一个手柄是一个指针或索引与连接到它没有可见的类型。通常你看到这样的:

 typedef void* HANDLE;
 HANDLE myHandleToSomething = CreateSomething();

因此,在你的代码中只是通过左右手柄作为一个不透明的价值。

在使用该对象的代码,它施放指针到实际结构类型,并使用它:

 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 ++堆使用newnew表达式的结果实现的对象是一个“正常”的指针。被管理对象在GC上分配(管理)堆与gcnew表达。其结果将是一个句柄。你不能做手柄指针运算。你不自由的手柄。 GC将照顾他们。此外,GC是自由移居在托管堆上对象和更新句柄程序正在运行时,以指向新的位置。

这出现在手柄本体-成语的上下文,也称为平普尔成语。它允许一个保持库的ABI(二进制接口)相同,通过保持实际数据到另一个类对象,其仅通过在一个“把手”对象保存一个指针引用,由函数代表该类别“身体”。

这也是有用的,以使恒定的时间和两个对象的异常安全交换。对于这一点,仅仅指向体对象的指针必须被交换。

一个手柄是你希望它是什么。

一个手柄可以在某些查找表中使用的无符号整数。

一个手柄可以是一个指针,或进入,较大的数据集。

这取决于使用该句柄代码的行为。确定所述手柄式。

原因“的手柄”使用该术语是什么是重要的。这表明它们作为对象的标识或访问类型。意,给程序员,它们代表一个 '键'使用的东西。

HANDLE hnd;相同void * ptr;

HANDLE是在Visual Studio(Windows)中的WINNT.H文件中定义一个typedef:

typedef void *HANDLE;

了解更多关于 HANDLE

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top