首页 文章

什么是C中的句柄?

提问于
浏览
86

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

7 回答

  • 88

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

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

  • 26

    在C / CLI中,句柄是指向位于GC堆上的对象的指针 . 使用 new 实现在(非托管)C堆上创建对象, new 表达式的结果是"normal"指针 . 使用 gcnew 表达式在GC(托管)堆上分配托管对象 . 结果将是一个句柄 . 你可以't do pointer arithmetic on handles. You don'吨免费提供 . GC会照顾他们 . 此外,GC可以自由地重新定位托管堆上的对象,并在程序运行时更新句柄以指向新位置 .

  • 1
    HANDLE hnd; is same as void * ptr;
    

    HANDLE是在visual studio(windows)中的winnt.h文件中定义的typefed .

    i.c: typedef void *HANDLE;

    了解更多关于HANDLE的信息

  • 5

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

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

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

    关键是当你有一个“句柄”时,你既不知道也不关心这个句柄最终如何识别它识别出来的东西,你需要知道的就是它 .

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

  • 5

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

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

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

  • 43

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

    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);
         }
     }
    
  • 1

    手柄就是你想要的 .

    句柄可以是某些查找表中使用的无符号整数 .

    句柄可以是指向更大数据集的指针 .

    这取决于使用句柄的代码的行为方式 . 这决定了句柄类型 .

    术语“ handle ' is used is what is important. That indicates them as an identification or access type of object. Meaning, to the programmer, they represent a ' key” or 访问某事的原因 .

相关问题