句柄是什么
传统上操作系统内核和系统服务API都是 C 语言接口,其内部设计理念上又是OO,所以有对象概念却没有对应的语言语法支持。
句柄的作用就是在 C 语言环境下代替 C++ 的对象指针,如果系统API是C++接口,那么就不用句柄而是用接口指针。
创建句柄就是构造,销毁句柄就是析构,用句柄调用函数相当于传入this指针。
句柄是一个智能指针,是一串当前系统下整数位数长度的数字,是内存块/对象/上下文的唯一标识。这串数字的来源有很多种:可以用内存地址,也可以用句柄表的序号,或者干脆用一个自增ID,再或者用以上的值去异或一个常数。
句柄 VS 指针
句柄是指向指针的指针,指针是一种内存地址;句柄知道所指的内存大小(即指针的大小),而指针不知道。
句柄是一个32位的整数,实际上是windows在内存中维护的一个对象(窗口等)内存物理地址列表的整数索引。因为windows的内存管理经常会将当前空闲对象的内存释放掉,当需要时访问再重新提交到物理存储,所以对象的物理地址是变化的,不允许程序直接通过物理地址来访问对象。
程序将想访问的对象的句柄传递给系统,系统根据句柄检索自己维护的对象列表就能知道程序想访问的对象及其物理地址了。
windows内存管理器经常在内存中来回移动对象,以此来满足各种应用程序的内存需要,对象被移动意味着它的地址变化了。如果地址总是如此的变化,我们应该去那里找对象呢?为了解决这个问题,windows操作系统为各个应用程序腾出一些内存地址,用来专门登记各个应用对象在内存中的地址变化,而这个地址(存储单元的位置)本身是不变的,即句柄地址。
windows内存管理器移动对象在内存中的位置后,把对象新的地址告知这个句柄地址来保存,这个地址是在对象装载(load)时由系统分配的,当系统卸载时又释放给系统。
句柄地址(稳定)—–>记载着对象在内存中的地址——–>对象在内存中的地址(不稳定)—–>实际对象。
注意,程序每次重新启动,句柄地址不一定不变。
句柄和指针其实是两个截然不同的概念。windows系统用句柄标记系统资源,用句柄隐藏系统信息。你只需要知道有这个东西,然后去调用它就行了,它是32bit的uint。指针则标记某个物理内存的地址,是不同的概念。
“牧童遥指杏花村”
牧童的手为指针,杏花村的牌子为句柄,杏花村酒店为对象的实例.
句柄是资源在创建过程中由Windows赋予的,它就是代表这个资源的。而指针实质上是某个变量或者对象所在内存位置的首地址,是指向对象的。
一个是指向,一个是代表,二者是不同的。
一个是直接找到对象(指针),一个是间接找到对象(句柄)。
例如,杏花村可以搬家(实际上程序运行过程中,资源在内存中的地址是变化的),那么牧童的手的指向也就不同(指针)了,然而即使搬了家,“杏花村”这块牌匾是不变的,通过打听“杏花村”这个名称,还是可以间接找到它的(地址)。
指针 VS 引用
引用是对象的别名,其实质就是功能受限但是安全性更高的指针。
-
引用访问一个变量是直接访问,而指针是间接访问。
-
引用是一个变量的别名,本身不单独分配自己的内存空间,而指针有自己的内存空间。
-
引用在开始的时候就绑定到了一个内存空间(开始必须赋初值),所以他只能是这个 内存空间的名字,而不能改成其他的,当然可以改变这个内存空间的值.
————————————————
版权声明:本文为CSDN博主「曾亲桂林」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/bigzql/article/details/111244244