Window s 内存管理 内存管理对于编写出高效率的Window s 程序是非常重要的,这是因为Window s 是多任务系统,它的内存管理和单任务的DOS 相比有很大的差异。DOS 是单任务操作系统,应用程序分配到内存后,如果它不主动释放,系统是不会对它作任何改变的;但 Window s却不然,它在同一时刻可能有多个应用程序共享内存,有时为了使某个任务更好地执行,Window s 系统可能会对其它任务分配的内存进行移动,甚至删除。因此,我们在 Window s应用程序中使用内存时,要遵循 Window s 内存管理的一些约定,以尽量提高Window s 内存的利用率。 Window s 内存对象 Window s 应用程序可以申请分配属于自己的内存块,内存块是应用程序操作内存的单位,它也称作内存对象,在 Window s 中通过内存句柄来操作内存对象。内存对象根据分配的范围可分为全局内存对象和局部内存对象;根据性质可分为固定内存对象,可移动内存对象和可删除内存对象。 固定内存对象,特别是局部固定内存对象和DOS 的内存块很类似,它一旦分配,就不会被移动或删除,除非应用程序主动释放它。并且对于局部固定内存对象来说,它的内存句柄本身就是内存对象的16 位近地址,可供应用程序直接存取,而不必象其它类型的内存对象那样要通过锁定在内存某固定地址后才能使用。 可移动内存对象没有固定的地址,Window s 系统可以随时把它们移到一个新地址。内存对象的可移动使得 Window s 能有效地利用自由内存。例如,如果一个可移动的内存对象分开了两个自由内存对象,Window s 可以把可移动内存对象移走,将两个自由内存对象合并为一个大的自由内存对象,实现内存的合并与碎片回收。 可删除内存对象与可移动内存对象很相似,它可以被 Window s移动,并且当 Window s需要大的内存空间满足新的任务时,它可以将可删除内存对象的长度置为0,丢弃内存对象中的数据。 可移动内存对象和可删除内存对象在存取前必须使用内存加锁函数将其锁定,锁定了的内存对象不能被移动和删除。因此,应用程序在使用完内存对象后要尽可能快地为内存对象解锁。内存需要加锁和解锁增加了程序员的负担,但是它却极大地改善了 Window s 内存利用的效率,因此 Window s 鼓励使用可移动和可删除的内存对象,并且要求应用程序在非必要时不要使用固定内存对象。 不同类型的对象在它所处的内存堆中的位置是不一样的,图 6.2 说明内存对象在堆中的位置:固定对象位于堆...