关于句柄和内存指针的不理解

一个程序员的修炼之路 2012-07-06 10:10:19
Windows内存管理器经常在内存中来回移动对象,这样对象的地址是可变的,因此我们不能直接用指针指向这个对象,然后进行访问;句柄表却可以维护这个变化的地址;

那为什么自己用malloc申请后空间,存放的对象,不会进行挪动呢?


我想我是不是哪里理解有问题
...全文
132 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
而句柄表中 句柄对应的内存地址 有些是通过 LocalAlloc GLobalAlloc等申请的,这些API设置内存是否FIXED,如果为非fixed,则操作系统是可以对其进行移动。


句柄的具体实现细节微软并没有公布,下面的来自百度百科:
Windows操作系统为全体应用程序腾出一些内存单元,用来专门登记各应用程序的对象在内存中的地址的变化,而前者的物理地址在系统运行期间是始终保持不变的。Windows内存管理器移动了对象在内存中的位置后,会把该对象新的地址及时地告知给对应的句柄进行更新。这样我们只要知道这个句柄,就可以间接地知道对象具体在内存中的哪个位置了。这个地址是在对象装载(Load)时由系统分配给的,当对象卸载时(Unload)又释放给系统。
dahaiI0 2012-07-06
  • 打赏
  • 举报
回复
内核对象的句柄是属于进程的,同一个句柄值在另一个进程里可能是另外一个内核对象的句柄,也有可能是一个无效的句柄,句柄在本进程是全局的,任何一个线程都可以使用

至于指针,个人的理解是,windows下指针的值本身是个逻辑地址而不是物理地址,这个值只在进程的地址空间内有效,其他进程如果用这个值,使用的也是本进程里在值上相同的一个逻辑地址,个人觉得一个进程的指针是没法让另一个进程使用的(或许是本人才疏学浅不知道)

虚拟地址与物理地址之间有个映射关系,这个映射是由MMU来做的,对我们来说是透明的。
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

句柄是在建立时,就形成的。。是一个全局的变量!
[/Quote]

你所说的全局,是什么意思? 是进程全局呢,还是系统全局呢?

针对同一个内核对象,不同进程句柄值是可以不一样的
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

引用楼主 的回复:
Windows内存管理器经常在内存中来回移动对象,这样对象的地址是可变的,因此我们不能直接用指针指向这个对象,然后进行访问;句柄表却可以维护这个变化的地址;

那为什么自己用malloc申请后空间,存放的对象,不会进行挪动呢?


我想我是不是哪里理解有问题


1. 句柄和指针,从根本的意义上来说都是unsigned int
2. 句柄用于表示某种资源……
[/Quote]

很感谢你,本来自己能够解决的,呵呵。
刚查看了MSDN,new 和 malloc 都是用 HeapAlloc去申请空间,然后MSDN查看了 HeapAlloc :

Memory allocated by HeapAlloc is not movable.


再次thank you!
shen_wei 2012-07-06
  • 打赏
  • 举报
回复
句柄是在建立时,就形成的。。是一个全局的变量!

  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

句柄是全局的,在整个操作系统里都是唯一的
指针是基于进程的,其它的进程想使用这个指针,需要计算出指针的绝对地址
[/Quote]
您说的唯一 是不是指内核对象
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

引用楼主 的回复:
Windows内存管理器经常在内存中来回移动对象,这样对象的地址是可变的,因此我们不能直接用指针指向这个对象,然后进行访问;句柄表却可以维护这个变化的地址;

那为什么自己用malloc申请后空间,存放的对象,不会进行挪动呢?


我想我是不是哪里理解有问题


1. 句柄和指针,从根本的意义上来说都是unsigned int
2. 句柄用于表示某种资源……
[/Quote]

过会儿再看下windows内存管理,再来和您讨论 哈哈~~~
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

句柄是全局的,在整个操作系统里都是唯一的
指针是基于进程的,其它的进程想使用这个指针,需要计算出指针的绝对地址
[/Quote]

感谢你的回答,不过我还有问题:

首先句柄是全局的?
这句话不知道是不是你没有表达清楚,句柄表本身也是每一个进程所有的吧。
在整个操作系统是唯一的?
这句话不太清楚

指针是基于进程的?
您的意思是不是windows下每个进程都有自己的虚拟空间地址,互不干扰;虚拟地址与物理地址之间有个映射关系
计算出来的绝对地址?
句柄表中的句柄对应一个内存地址,最终计算出来的也是物理地址吧,没有这个区别吧
majia2011 2012-07-06
  • 打赏
  • 举报
回复
头一次听说,有“在内存中来回移动对象”这个说话,呵呵呵
pathuang68 2012-07-06
  • 打赏
  • 举报
回复
[Quote=引用楼主 的回复:]
Windows内存管理器经常在内存中来回移动对象,这样对象的地址是可变的,因此我们不能直接用指针指向这个对象,然后进行访问;句柄表却可以维护这个变化的地址;

那为什么自己用malloc申请后空间,存放的对象,不会进行挪动呢?


我想我是不是哪里理解有问题
[/Quote]

1. 句柄和指针,从根本的意义上来说都是unsigned int
2. 句柄用于表示某种资源(比如,一个文件的句柄),指针用来指示内存地址,它们的意图是不一样的。
3. 自己用malloc申请空间存放的对象,不会进行挪动。
ouyh12345 2012-07-06
  • 打赏
  • 举报
回复
句柄是全局的,在整个操作系统里都是唯一的
指针是基于进程的,其它的进程想使用这个指针,需要计算出指针的绝对地址

64,666

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧