句柄与指针的区别(一)
学习 C++的人都知道句柄和指针,而且我发现很多人在句柄与指针之间直接划等号,对我
们来说两者都是地址,我觉的这也造成很多人将句柄和指针划等号的直接原因。
首先说指针吧。通俗一点就是地址,他是内存的编号,通过它我们可以直接对内存进
行操作,只要地址不变,我们每次操作的物理位置是绝对不变,记住这句话,这是句柄和
指针的重大区别所在。
再说说句柄吧,一般是指向系统的资源的位置,可以说也是地址。但是这些资源的位
置真的不变,我们都知道 window 支持虚拟内存的技术,同一时间内可能有些资源被换出
内存,一些被换回来,这就是说同一资源在系统的不同时刻,他在内存的物理位置是不确
定的,那么 window 是如何解决这个问题呢,就是通过句柄来处理资源的物理位置不断变
化的这个问题的。window 会在物理位置固定的区域存储一张对应表,表中记录了所有的资
源实时地址,句柄其实没有直接指向资源的物理地址,而是指向了这个对应表中的一项,
这样无论资源怎样的换进换出,通过句柄都可以找到他的实时位置。
总的来说,通过句柄可以屏蔽系统内部的细节,让程序设计可以不必考虑操作系统实
现的细节。如果还不能理解句柄与指针之间的区别,可以想象指向指针的指针,可以把句
柄当作一个指向指针的指针来理解。
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
句柄其实就是指针,但是他和指针最大的不同是:给你一个指针,你可以通过这个指针做任
何事情,也许是好事,也许是通过这个指针破坏内存,干一些捣乱的事情。这个我想大家
都会碰到过,因为乱用指针导致程序崩溃
句柄就没有这个缺点,通过句柄,你只能干一些 windows 让你干的事情(调用一些 api 函
数等等),没有了指针的坏处。
句柄是一些表的索引也就是指向指针的指针,句柄和指针都是地址,句柄是 Windows 编程
的一个关键性的概念,编写 Windows 应用程序总是要和各种句柄打交道。
所谓句柄,就是一个唯一的数,用以标识许多不同的对象类型,如窗口、菜单、内存、画
笔、画刷等。在 Win32 里,句柄是指向一个“无类型对象”(void*)的指针,也就是一个 4 字
节长的数据。
无论它的本质是什么,句柄并不是一个真正意义上的指针。从构造上看,句柄是一个指针
尽管它没有指向用于存储某个对象的内存位置。事实上,句柄指向一个包含了对该对象进
行的引用的位置。
句柄的声明是这样的:
typedef void *HANDLE
由于 Windows 是一个多任务操作系统,它可以同时运行多个程序或一个程序的多个副本。
这些运行的程序称为一个实例。为了对同一程序的多个副本进行管 理,Windows 引入了实
例句柄。Windows 为每个应用程序建立一张表,实例句柄就好象是这张表的一个索引。
不同在于:
1、句柄所指的可以是一个很复杂的结构,并且很有可以是与系统有关的,比如说上面所说
的线程的句柄,它指向的就是一个类或者结构,他和系统有很密切的关 系,当一个线程由
于不可预料的原因,而终止时在系统就可以回它所占用的资料,如 CPU,内存等等,反过
来想可以知道,这个句柄中的某一些项,是与系统进行 交互的。由于 Windows 系统,是一
个多任务的系统,它随时都可能要分配内存,回收内存,重组内存。
2、指针它也可以指向一个复杂的结构,但是通常是用户定义的,所以的必需的工作都要用
户完成,特别是在删除的时候。但在 VC++6.0 中也有一些指针,它 们都是处理一些小问
题才用的,如最常见的字符的指针,它也是要用户处理的如果你动态分配了内存;但是