句柄和指针的区别
2015-09-25 10:44
267 查看
首先,指针指向系统中物理内存的地址,而句柄是windows在内存中维护的一个对象内存物理地址列表的整数索引,句柄是一种指向指针的指针。
在windows系统中的内存管理一般会将当前处于空闲状态的对象的内存释放掉,当需要访问的时候再重新提交分配物理内存,从而导致对象的物理地址是变化的,
这样就不允许系统直接通过指针来访问(物理地址不断变化)的对象。
句柄是一种指向指针的指针。由于windows是一种以虚拟内存为基础的操作系统,其内存管理器经常会在内存中来回的移动对象,以此来满足各种应用程序对内存的需求。
而对象的移动意味着对象内存地址的变化,正是因为如此,如果直接使用指针,在内存地址被改变后,系统将不知道到哪里去再调用这个对象。
windows系统为论文解决这个问题,系统专门为各种应用程序腾出了一定的内存地址(句柄)专门用来记录这些变化的地址(这些内存地址就是指向指针的指针),这些内存地址本身是一直不变化的。windows内存管理器在移动某些对象之后,他会将这些对象新的内存地址传给句柄,告诉他移动后对象去了哪里。
指针可以直接操作内核对象,这样可以修改数据,比较危险。不是我们想要的。而句柄只是一个索引,通过API函数来操作就安全很多。由于windows内存中的数据转移(在内存和硬盘中来回转移)若是使用指针的话,无法找到对应的指针位置,而句柄则是专门记录这种地址变动的。
句柄(稳定的)----->记载着对象在内存中的地址---->对象在内存中的地址(不稳定的)---->记载着实际对象的地址。
图中实线表示初始化的情况,虚线表示在内存管理器处理之后的情况
在windows系统中的内存管理一般会将当前处于空闲状态的对象的内存释放掉,当需要访问的时候再重新提交分配物理内存,从而导致对象的物理地址是变化的,
这样就不允许系统直接通过指针来访问(物理地址不断变化)的对象。
句柄是一种指向指针的指针。由于windows是一种以虚拟内存为基础的操作系统,其内存管理器经常会在内存中来回的移动对象,以此来满足各种应用程序对内存的需求。
而对象的移动意味着对象内存地址的变化,正是因为如此,如果直接使用指针,在内存地址被改变后,系统将不知道到哪里去再调用这个对象。
windows系统为论文解决这个问题,系统专门为各种应用程序腾出了一定的内存地址(句柄)专门用来记录这些变化的地址(这些内存地址就是指向指针的指针),这些内存地址本身是一直不变化的。windows内存管理器在移动某些对象之后,他会将这些对象新的内存地址传给句柄,告诉他移动后对象去了哪里。
指针可以直接操作内核对象,这样可以修改数据,比较危险。不是我们想要的。而句柄只是一个索引,通过API函数来操作就安全很多。由于windows内存中的数据转移(在内存和硬盘中来回转移)若是使用指针的话,无法找到对应的指针位置,而句柄则是专门记录这种地址变动的。
句柄(稳定的)----->记载着对象在内存中的地址---->对象在内存中的地址(不稳定的)---->记载着实际对象的地址。
图中实线表示初始化的情况,虚线表示在内存管理器处理之后的情况
相关文章推荐
- 初遇反射
- 浅谈C#中一种类插件系统编写的简单方法(插件间、插件宿主间本身不需要通信)
- 项目完成了,如释重负
- java各数据库的连接字符串
- Codeforces 443 B. Kolya and Tandem Repeat
- 第四次作业
- js日期格式转化
- 枚举
- Android 属性总结
- codeforces 573C. Bear and Drawing
- Android 使用动态加载框架DL进行插件化开发
- 大数据---spark系列--DateFrame
- Android实战简易教程<十一>(树形组件:ExpandableListView显示和动态添加删除)
- SQL的一些小问题
- 引用的本质就是指针常量
- code扫描雷达
- python中pyserial模块使用方法
- servlet的执行原理与生命周期
- ubuntu 12.04 adb命令识别不到手机
- 老程序员的忠告:不要做浮躁的软件工程师