欢迎光临散文网 会员登陆 & 注册

句柄与指针的区别

2023-09-19 11:44 作者:bramble1990  | 我要投稿

1.句柄与指针,是什么?

  • 指针:

指针 英文代称:pointer

指针也就是内存地址,指针变量是用来存放内存地址的变量,在同一CPU架构下,不同类型的指针变量所占用的存储单元长度是相同的,而存放数据的变量因数据的类型不同,

所占用的存储空间长度也不同。有了指针以后,不仅可以对数据本身,也可以对存储数据的变量地址进行操作


  • 句柄:


句柄 英文代称:handle

在英文中:有操作、处理、控制之类的意义。作为一个名词时,是指某个中间媒介,通过这个中间媒介可控制、操作某样东西

通俗的比喻:

1.句柄就好比手机号码,你不必时时刻刻关心你要联系的人在哪里,你只要有需要的时候根据电话号码打ta电话就能跟ta联系

2.就比如把手:门把手、锅把手、铲把手、刀把;它们并不直接提供功能性而是一种媒介 是你使用上面:门、锅、铲、刀必须要握或拿的。

从计算机领域来讲句柄handle通常是某个数字标记,通过标记操作资源。在计算机领域有不同的叫法,有时叫ID,有时叫描述符(descriptor),在Windows平台就叫各种 handle了


2.为什么必须用句柄?

句柄:是一个long形的整数值,长度为16位。应用程序先调用一个Windows函数来获得一个句柄,之后其他的Windows函数就可以使用该句柄,以引用相应的对象。在Windows编程中会用到大量的句柄


3.句柄,上下文,混淆?

  • 上下文:

上下文· 英文代称:Context

计算机中,相对于进程而言,上下文就是进程执行时的环境。具体来说就是各个变量和数据,包括所有的寄存器变量、进程打开的文件、内存信息等。

环境可以包括当时程序状态以及变量的状态,例如线程切换的时候在内核会发生上下文切换,这里的上下文就包括了当时寄存器的值,把寄存器的值都保存起来,

等下次该线程又得到CPU时间的时候再恢复寄存器的值,这样程序才能正确的运行。

  • 总结:

句柄与上下文不同 上下文是一种环境,句柄是调用某个程序的整数值



 句柄和指针是两个关键的概念,在计算机科学中经常被使用。它们的主要目的是支持系统内存的动态分配和管理,以确保在运行时程序可以动态地访问和操作不同类型的数据。句柄和指针有许多相同之处,但它们还有一些重要的区别,这些区别对于理解它们的实际用途和使用情况非常重要。在本文中,我们将详细探讨句柄和指针的概念以及它们之间的区别。

  一、句柄的定义

  句柄是一种指向内存块的特殊类型的指针。它是一种用来表示一个对象或对象的引用的句柄,通常是一个整数值。句柄值很少直接使用,而是在API调用中使用。由于句柄是指向对象的指针,因此它们经常用于动态堆内存分配,例如,向操作系统请求动态分配内存而没有直接使用指针来指向内存块。句柄还被用于通过非托管代码访问托管对象,非托管代码不能直接访问托管对象,只能通过托管代码提供的句柄来间接访问。

  二、指针的定义

  指针是在程序中指向内存地址的变量,它存储了所指向的内存地址。指针可以指向内存中的任何数据类型的变量,包括标量、数组、结构体和函数等。指针经常用于在程序中动态地分配和管理内存,以及通过引用修改调用函数中的变量。指针还可以用于实现链表、树状结构、堆栈和队列等数据结构。

  三、句柄和指针之间的区别

  1. 句柄是一种特殊类型的指针,而指针可以指向任何类型的内存块。

  2. 句柄值很少直接使用,而是在API调用中使用,而指针可以在程序中直接使用。

  3. 句柄经常用于在程序中实现对象引用,而指针主要用于动态内存管理和数据结构。

  4. 句柄可以用于通过非托管代码访问托管对象,而指针不能这样做。

  5. 句柄通常比指针更安全,因为它们隐藏了底层指针的细节,从而可以减少出现错误的机会,还可以通过显式释放句柄来避免内存泄漏。

  四、总结

  句柄和指针是操作系统和编程语言中非常重要的概念。它们之间有许多相同之处,但在实际应用中也有一些重要的不同点。在编写程序时,程序员必须正确地使用句柄和指针,以避免不良的内存管理和不必要的程序异常。只有深入了解句柄和指针之间的区别,才能为程序设计带来更大的灵活性和安全性,并且能够正确地解决与内存分配和管理相关的问题。



句柄是一种特殊的智能指针 。当一个应用程序要引用其他系统(如数据库、操作系统)所管理的内存块或对象时,就要使用句柄。


句柄与普通指针的区别在于,指针包含的是引用对象的内存地址,而句柄则是由系统所管理的引用标识,该标识可以被系统重新定位到一个内存地址上。这种间接访问对象的模式增强了系统对引用对象的控制。


句柄就是个数字,一般和当前系统下的整数的位数一样,比如32bit系统下就是4个字节。




       

这个数字是一个对象的唯一标示,和对象一一对应。       

这个对象可以是一个块内存,一个资源,或者一个服务的context(如 socket,thread)等等。     


 

这个数字的来源可以有很多中,只要能保证和它代表的对象保持唯一对应就可以,比如可以用内存地址,也可以用句柄表的序号,或者干脆用一个自增ID,再或者用以上的值去异或一个常数。


传统上操作系统内核和系统服务API都是 C 语言接口的,但是其内部设计理念上又是OO的,所以有对象概念却没有对应的语言语法支持。     


 

句柄的作用就是在 C 语言环境下代替 C++ 的对象指针来用的。       

创建句柄就是构造,销毁句柄就是析构,用句柄调用函数相当于传入this指针。       

如果有系统API是 C++ 接口的,那么就没有句柄了,而是某个接口指针,IXXXPtr之类的,比如Windows的com ptr。


句柄和指针的区别

当把硬盘上的资源调入内存以后,将有一个句柄指向它,但是句柄只能指向一个资源。而且句柄知道所指的内存有多大。还有指针,指针指向地址,它不知道分配的内存有多大。


句柄是一个32位的整数,实际上是windows在内存中维护的一个对象(窗口等)内存物理地址列表的整数索引。因为windows的内存管理经常会将当前空闲对象的内存释放掉,当需要时访问再重新提交到物理存储,所以对象的物理地址是变化的,不允许程序直接通过物理地址来访问对象。


程序将想访问的对象的句柄传递给系统,系统根据句柄检索自己维护的对象列表就能知道程序想访问的对象及其物理地址了。句柄是一种指向指针的指针。我们知道,所谓指针是一种内存地址。


应用程序启动后,组成这个程序的各个对象是驻留在内存的。如果简单地理解,似乎我们只要获知这个内存的首地址,那么就可以随时用这个地址访问对象了。


但是,如果真这么认为,那么就大错特错了。我们知道windows是一个虚拟内存为基础的操作系统。


在这种情况下,windows内存管理器经常在内存中来回移动对象,以此来满足各种应用程序的内存需要,对象被移动意味着它的地址变化了。如果地址总是如此的变化,我们应该去那里找对象呢?为了解决这个问题,windows操作系统为各个应用程序腾出一些内存地址,用来专门登记各个应用对象在内存中的地址变化,而这个地址(存储单元的位置)本身是不变的。


windows内存管理器移动对象在内存中的位置后,把对象新的地址告知这个句柄地址来保存。这样我们只需要记住这个句柄地址就可以间接地知道对象具体在内存中哪个位置了。


这个地址是在对象装载(load)时由系统分配的,当系统卸载时又释放给系统。句柄地址(稳定)—–>记载着对象在内存中的地址——–>对象在内存中的地址(不稳定)—–>实际对象。但是必须注意,程序每次重新启动,系统不保证分配跟这个程序的句柄还是原来哪个句柄,而绝大多数情况下的确不一样。假如我们把进入电影院看电影看成是一个应用程序的启动运行,那么系统给应用程序分配的句柄总是不一样,这和每次电影院给我们的门票总是不同的座位是一个道理。


因此,句柄和指针其实是两个截然不同的概念。windows系统用句柄标记系统资源,用句柄隐藏系统信息。你只需要知道有这个东西,然后去调用它就行了,它是32bit的uint。指针则标记某个物理内存的地址,是不同的概念。


指针对应着一个数据在内存中的地址,得到了指针就可以自由地修改该数据。Windows并不希望一般程序修改其内部数据结构,因为这样太不安全。所以Windows给每个使用GlobalAlloc等函数声明的内存区域指定一个句柄(本质上仍是一个指针,但不要直接操作它),平时你只是在调用API函数时利用这个句柄来说明要操作哪段内存。当你需要对某个内存进行直接操作时,可以使用GlobalLock锁住这段内存并获得指针来直接进行操作。


句柄是指针的“指针”,使用句柄主要是为了利于windows在进程内存地址空间移动分配的内存块,以防止进程的内存空间被撕的四分五裂而存在过多的碎片。


句柄是一些表的索引也就是指向指针的指针。间接的引用对象,windows可以修改对象的”物理”地址和?描述器的值,但是句柄的值是不变的。


句柄可以在获得窗口的时候使用,指针可以进行调用窗口,两个使用的地方不一样.一个括号外,一个括号内.


隐喻

CSDN上有人说过:牧童遥指杏花村。       

牧童的手为指针,杏花村的牌子为句柄,杏花村酒店为对象的实例.        

句柄是资源在创建过程中由Windows赋予的,它就是代表这个资源的。


而指针实质上是某个变量或者对象所在内存位置的首地址,是指向对象的。


一个是指向,一个是代表,二者是不同的。


一个是直接找到对象(指针),一个是间接找到对象(句柄)。


例如,杏花村可以搬家(实际上程序运行过程中,资源在内存中的地址是变化的),那么牧童的手的指向也就不同(指针)了,然而即使搬了家,“杏花村”这块牌匾是不变的,通过打听“杏花村”这个名称,还是可以间接找到它的(地址)。


HANDLE的本意是把柄,把手的意思,是你与操作系统打交道的东东。






句柄与指针的区别的评论 (共 条)

分享到微博请遵守国家法律