
学习Windows程序设计的时候遇到一些问题,请明白的朋友帮个忙吧。
学到第十三章-剪贴板的时候,对于里面的一些地方不太明白:一:原文提到:“如果应用程序频繁的分配、重分配、释放不同大小的内存块,应用程序虚拟地址空间就会变得七零八落,你可能...
学到第十三章-剪贴板的时候,对于里面的一些地方不太明白:
一:原文提到:“如果应用程序频繁的分配、重分配、释放不同大小的内存块,应用程序虚拟地址空间就会变得七零八落,你可能会把虚拟内存地址用完。”
我的问题是:既然内存被分配后又被释放了,那么就没有发生内存泄露啊,为什么会出现用完的情形呢?
二:教材里提到了关于”可移动内存“的概念,里面有一句话这样写:”定义HGLOBAL hGlobal类型的全局变量后,使用GlobalLock(hGlobal)函数可以将hGlobal内存块锁定,在内存块被锁定期间,Windows会修复虚拟内存地址,内存块不会移动“,请问这里的”内存块不会移动”是什么意思?
三:还是关于锁定内存块的问题,锁定内存块究竟起到什么作用?为何将内存块传入剪贴板之前必须先使用GlobalUnlock()函数对内存块进行解锁呢?
我使用如下语句打印了分配时全局变量hGlobal的值和锁定以后的值,发现发生了变化,这是为什么呢?
代码:
HGLOBAL hGlobal ;
hGlobal = GlobalAlloc (GHND, 1024) ;
cout << hGlobal ;
cout << endl ;
hGlobal = GlobalLock (hGlobal) ;
cout << hGlobal ;
cout << endl ;
结果显示:
0x00440004
0x00143368 展开
一:原文提到:“如果应用程序频繁的分配、重分配、释放不同大小的内存块,应用程序虚拟地址空间就会变得七零八落,你可能会把虚拟内存地址用完。”
我的问题是:既然内存被分配后又被释放了,那么就没有发生内存泄露啊,为什么会出现用完的情形呢?
二:教材里提到了关于”可移动内存“的概念,里面有一句话这样写:”定义HGLOBAL hGlobal类型的全局变量后,使用GlobalLock(hGlobal)函数可以将hGlobal内存块锁定,在内存块被锁定期间,Windows会修复虚拟内存地址,内存块不会移动“,请问这里的”内存块不会移动”是什么意思?
三:还是关于锁定内存块的问题,锁定内存块究竟起到什么作用?为何将内存块传入剪贴板之前必须先使用GlobalUnlock()函数对内存块进行解锁呢?
我使用如下语句打印了分配时全局变量hGlobal的值和锁定以后的值,发现发生了变化,这是为什么呢?
代码:
HGLOBAL hGlobal ;
hGlobal = GlobalAlloc (GHND, 1024) ;
cout << hGlobal ;
cout << endl ;
hGlobal = GlobalLock (hGlobal) ;
cout << hGlobal ;
cout << endl ;
结果显示:
0x00440004
0x00143368 展开
2个回答
展开全部
“既然内存被分配后又被释放了,那么就没有发生内存泄露啊,为什么会出现用完的情形呢?”
这个用完并不是指真正的用完了,而是未分配内存都变成了碎片,当你需要一个较大内存块的时候,就算这些内存碎片加起来超过需要,依然会分配失败,显而易见了。
“请问这里的”内存块不会移动”是什么意思?” 可移动内存是windows内存管理的一种机制,windows会根据需要将可移动内存转移到其他地方(实际物理内存位置不变,只是改变虚拟内存),从而提高内存使用效率。 内存锁定后,内存地址不再改变,同时在切换到其他任务时,不可以对该块内存进行访问。这是多任务环境下对于共享资源采取的互斥机制,保证程序不会因为任务切换而发生错误。所以为什么需要解锁就好理解了吧。
至于最后内存句柄值不一样,应该就是内存移动的原因吧。
这个用完并不是指真正的用完了,而是未分配内存都变成了碎片,当你需要一个较大内存块的时候,就算这些内存碎片加起来超过需要,依然会分配失败,显而易见了。
“请问这里的”内存块不会移动”是什么意思?” 可移动内存是windows内存管理的一种机制,windows会根据需要将可移动内存转移到其他地方(实际物理内存位置不变,只是改变虚拟内存),从而提高内存使用效率。 内存锁定后,内存地址不再改变,同时在切换到其他任务时,不可以对该块内存进行访问。这是多任务环境下对于共享资源采取的互斥机制,保证程序不会因为任务切换而发生错误。所以为什么需要解锁就好理解了吧。
至于最后内存句柄值不一样,应该就是内存移动的原因吧。
展开全部
一、文中所提到的“虚拟内存”指的是应用程序拥有的虚拟4GB的flat段,并不是真正的物理内存。某个程序的空间就是这个虚拟的4GB,当然,每个程序运行在x86上面都会是4GB的虚拟内存空间。而程序A不断做一些不受系统推荐的内存操作(实际上是对自身的4GB操作)时,就会产生碎片。 当碎片多到4GB全占了,就用完了。 而所谓的释放,你指的应该是程序被终结后,他的“4GB空间”将被释放,所影响的物理内存也将被释放,所以不会影响到操作系统的运行,但再次运行程序时,他将会被重新分配4G的虚拟空间。 但是,严重的问题一般出在系统内核中,假如系统的内核程序设计不当,由于内核一般是随着系统一直在运行的,当内核出现内存泄漏的情况,很快到来的是蓝屏。。。。 以上全手打,个人见解。详情请参阅《深入理解计算机系统》,这本书可能有这个内容,虽然我想买一本看却又没钱但是能猜到有。
后面的知识自己去查吧,再手打我就要吐血了。
PS:本人正在研究 win32汇编和PE文件格式以及病毒免杀技术ing。 同道中人可互相探讨。
后面的知识自己去查吧,再手打我就要吐血了。
PS:本人正在研究 win32汇编和PE文件格式以及病毒免杀技术ing。 同道中人可互相探讨。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询