社区
C++ 语言
帖子详情
关于句柄和内存指针的不理解
一个程序员的修炼之路
2012-07-06 10:10:19
Windows内存管理器经常在内存中来回移动对象,这样对象的地址是可变的,因此我们不能直接用指针指向这个对象,然后进行访问;句柄表却可以维护这个变化的地址;
那为什么自己用malloc申请后空间,存放的对象,不会进行挪动呢?
我想我是不是哪里理解有问题
...全文
132
11
打赏
收藏
关于句柄和内存指针的不理解
Windows内存管理器经常在内存中来回移动对象,这样对象的地址是可变的,因此我们不能直接用指针指向这个对象,然后进行访问;句柄表却可以维护这个变化的地址; 那为什么自己用malloc申请后空间,存放的对象,不会进行挪动呢? 我想我是不是哪里理解有问题
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
11 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
一个程序员的修炼之路
2012-07-06
打赏
举报
回复
而句柄表中 句柄对应的内存地址 有些是通过 LocalAlloc GLobalAlloc等申请的,这些API设置内存是否FIXED,如果为非fixed,则操作系统是可以对其进行移动。
句柄的具体实现细节微软并没有公布,下面的来自百度百科:
Windows操作系统为全体应用程序腾出一些内存单元,用来专门登记各应用程序的对象在内存中的地址的变化,而前者的物理地址在系统运行期间是始终保持不变的。Windows内存管理器移动了对象在内存中的位置后,会把该对象新的地址及时地告知给对应的句柄进行更新。这样我们只要知道这个句柄,就可以间接地知道对象具体在内存中的哪个位置了。这个地址是在对象装载(Load)时由系统分配给的,当对象卸载时(Unload)又释放给系统。
dahaiI0
2012-07-06
打赏
举报
回复
内核对象的句柄是属于进程的,同一个句柄值在另一个进程里可能是另外一个内核对象的句柄,也有可能是一个无效的句柄,句柄在本进程是全局的,任何一个线程都可以使用
至于指针,个人的理解是,windows下指针的值本身是个逻辑地址而不是物理地址,这个值只在进程的地址空间内有效,其他进程如果用这个值,使用的也是本进程里在值上相同的一个逻辑地址,个人觉得一个进程的指针是没法让另一个进程使用的(或许是本人才疏学浅不知道)
虚拟地址与物理地址之间有个映射关系,这个映射是由MMU来做的,对我们来说是透明的。
一个程序员的修炼之路
2012-07-06
打赏
举报
回复
[Quote=引用 7 楼 的回复:]
句柄是在建立时,就形成的。。是一个全局的变量!
[/Quote]
你所说的全局,是什么意思? 是进程全局呢,还是系统全局呢?
针对同一个内核对象,不同进程句柄值是可以不一样的
一个程序员的修炼之路
2012-07-06
打赏
举报
回复
[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
打赏
举报
回复
句柄是在建立时,就形成的。。是一个全局的变量!
一个程序员的修炼之路
2012-07-06
打赏
举报
回复
[Quote=引用 1 楼 的回复:]
句柄是全局的,在整个操作系统里都是唯一的
指针是基于进程的,其它的进程想使用这个指针,需要计算出指针的绝对地址
[/Quote]
您说的唯一 是不是指内核对象
一个程序员的修炼之路
2012-07-06
打赏
举报
回复
[Quote=引用 2 楼 的回复:]
引用楼主 的回复:
Windows内存管理器经常在内存中来回移动对象,这样对象的地址是可变的,因此我们不能直接用指针指向这个对象,然后进行访问;句柄表却可以维护这个变化的地址;
那为什么自己用malloc申请后空间,存放的对象,不会进行挪动呢?
我想我是不是哪里理解有问题
1. 句柄和指针,从根本的意义上来说都是unsigned int
2. 句柄用于表示某种资源……
[/Quote]
过会儿再看下windows内存管理,再来和您讨论 哈哈~~~
一个程序员的修炼之路
2012-07-06
打赏
举报
回复
[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
打赏
举报
回复
句柄是全局的,在整个操作系统里都是唯一的
指针是基于进程的,其它的进程想使用这个指针,需要计算出指针的绝对地址
MT5 非区间均线回归刷单EA教学
想编写EA苦于不知道如何下手的学员! 3.能看懂代码的学员! 4.不啰嗦直接上干货! 5.固定框架式编程! 6.面向对象,面向函数式编程! //--- 交易.追踪止损(Symbol(),追踪点值,magic号码);  ...
引用、
指针
和
句柄
的区别
句柄
是一种特殊的智能
指针
。当一个应用程序要引用其他系统(如数据库、操作系统)所管理的
内存
块或对象时,就要使用
句柄
。
句柄
与普通
指针
的区别在于,
指针
包含的是引用对象的
内存
地址,而
句柄
则是由...
句柄
与
指针
的区别
句柄
其实就是
指针
,但是他和
指针
最大的不同是:给你一个
指针
,你可以通过这个
指针
做任何事情,也许是好事,也许是通过这个
指针
破坏
内存
,干一些捣乱的事情。这个我想大家都会碰到过,因为乱用
指针
导致程序崩溃 ...
Java
句柄
与
指针
句柄
不代表对象的
内存
地址。在Java中的任何东西都可以看做对象,存在一种标识符实际指向一个对象的
句柄
.在Java的其他地方或者数据中也有称为 "引用"或者 "
指针
". 只是一个引用地址,我们不能认为Java中没有
指针
,其实这...
句柄
和
指针
的
理解
在Windows 编程中,可以通过
指针
和
句柄
对对象进行操作。
句柄
是OS分配的,唯一的一个长整型数值。操作系统中的每一个对象,窗口,按钮等都有一个唯一的
句柄
标识它们。开发人员通过
句柄
与操作系统进行通话,从而可以...
C++ 语言
64,666
社区成员
250,488
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章