“既然内存被分配后又被释放了,那么就没有发生内存泄露啊,为什么会出现用完的情形呢?”
这个用完并不是指真正的用完了,而是未分配内存都变成了碎片,当你需要一个较大内存块的时候,就算这些内存碎片加起来超过需要,依然会分配失败,显而易见了。
“请问这里的”内存块不会移动”是什么意思?” 可移动内存是windows内存管理的一种机制,windows会根据需要将可移动内存转移到其他地方(实际物理内存位置不变,只是改变虚拟内存),从而提高内存使用效率。 内存锁定后,内存地址不再改变,同时在切换到其他任务时,不可以对该块内存进行访问。这是多任务环境下对于共享资源采取的互斥机制,保证程序不会因为任务切换而发生错误。所以为什么需要解锁就好理解了吧。
至于最后内存句柄值不一样,应该就是内存移动的原因吧。
一、文中所提到的“虚拟内存”指的是应用程序拥有的虚拟4GB的flat段,并不是真正的物理内存。某个程序的空间就是这个虚拟的4GB,当然,每个程序运行在x86上面都会是4GB的虚拟内存空间。而程序A不断做一些不受系统推荐的内存操作(实际上是对自身的4GB操作)时,就会产生碎片。 当碎片多到4GB全占了,就用完了。 而所谓的释放,你指的应该是程序被终结后,他的“4GB空间”将被释放,所影响的物理内存也将被释放,所以不会影响到操作系统的运行,但再次运行程序时,他将会被重新分配4G的虚拟空间。 但是,严重的问题一般出在系统内核中,假如系统的内核程序设计不当,由于内核一般是随着系统一直在运行的,当内核出现内存泄漏的情况,很快到来的是蓝屏。。。。 以上全手打,个人见解。详情请参阅《深入理解计算机系统》,这本书可能有这个内容,虽然我想买一本看却又没钱但是能猜到有。
后面的知识自己去查吧,再手打我就要吐血了。
PS:本人正在研究 win32汇编和PE文件格式以及病毒免杀技术ing。 同道中人可互相探讨。