
项目6:内存分配一PDA的内存管理 (2) 本节课程主要知识点 ·堆 ▣栈 ■各种内存分配方法的对比
项目6:内存分配-PDA的内存管理(2) 本节课程主要知识点 ◼ 堆 ◼ 栈 ◼ 各种内存分配方法的对比

重点和难点 重点 ■堆和栈的基本概念 难点 ■堆的使用
重点和难点 重点 ◼ 堆和栈的基本概念 难点 ◼ 堆的使用

堆
堆

堆 ■堆是一段连续的虚拟地址空间。每一个 进程都管理着一个堆。 ■应用程序在堆中可以动态地分配、释放 所需大小的内存块。 ■在堆内分配内存块可以是任意大小的, 而直接分配内存就必须以内存页为单位
堆 ◼ 堆是一段连续的虚拟地址空间。每一个 进程都管理着一个堆。 ◼ 应用程序在堆中可以动态地分配、释放 所需大小的内存块。 ◼ 在堆内分配内存块可以是任意大小的, 而直接分配内存就必须以内存页为单位

内存的页 ·内存是以页为单位分配的。 ■内存页的大小与具体的CPU有关。 ■页的大小一般是1KB,4KB,64KB等
内存的页 ◼ 内存是以页为单位分配的。 ◼ 内存页的大小与具体的CPU有关。 ◼ 页的大小一般是1KB,4KB,64KB等

本地堆 ■默认情况下,Windows CE为本地堆保留 192KB的虚拟内存空间,如果不够的话, 可用函数VirtualAlloc(0申请更多的内存。 ■192KB的虚拟内存并不立刻提交分配物 理内存。 ·当堆中的块被释放时,系统将查看是否 整个页都已经被释放,如果是那个页将 被回收
本地堆 ◼ 默认情况下,Windows CE为本地堆保留 192KB的虚拟内存空间,如果不够的话, 可用函数VirtualAlloc()申请更多的内存。 ◼ 192KB的虚拟内存并不立刻提交分配物 理内存。 ◼ 当堆中的块被释放时,系统将查看是否 整个页都已经被释放,如果是那个页将 被回收

在本地堆中分配内存 ■堆内分配内存可以任意大小,单位为字 节,所分配的内存称为块。 ■使用完后注意要回收分配的内存。 ·在堆中申请内存可使用malloc/fee、 new/delete、LocalAlloc/LocallFree等函数。 ■Windows CE5.0只支持堆中固定块的分配, 这样随着时间的推移,多次创建释放内 存块,堆内就会产生大量内存的碎片
在本地堆中分配内存 ◼ 堆内分配内存可以任意大小,单位为字 节,所分配的内存称为块。 ◼ 使用完后注意要回收分配的内存。 ◼ 在堆中申请内存可使用malloc/free、 new/delete、LocalAlloc/LocallFree等函数。 ◼ Windows CE5.0只支持堆中固定块的分配, 这样随着时间的推移,多次创建释放内 存块,堆内就会产生大量内存的碎片

堆的操作函数 LocalAlloc 在堆中申请内存 ■LocalFree 释放使用过的内存 ■HeapCreate 创建堆 HeapFree 释放堆
堆的操作函数 ◼ LocalAlloc 在堆中申请内存 ◼ LocalFree 释放使用过的内存 ◼ HeapCreate 创建堆 ◼ HeapFree 释放堆

堆的碎片 a在Windows CE5.0创建的堆中,所申请的 内存块不能够移动,多次创建内存块、 释放内存块会产生内存碎块。 ·当需要分配一个大一点的、连续的内存 块时,本来空闲的内存块加起来足够大 但是这些内存块是分隔的,系统无法分 配这些内存碎片
堆的碎片 ◼ 在Windows CE5.0创建的堆中,所申请的 内存块不能够移动,多次创建内存块、 释放内存块会产生内存碎块。 ◼ 当需要分配一个大一点的、连续的内存 块时,本来空闲的内存块加起来足够大, 但是这些内存块是分隔的,系统无法分 配这些内存碎片

碎片的解决 ■程序员如果要频繁的在堆中创建、释放 内存块的话,最好自己创建一个单独的 堆,而不用默认的堆。 ·在使用结束后要及时释放掉该内存堆
碎片的解决 ◼ 程序员如果要频繁的在堆中创建、释放 内存块的话,最好自己创建一个单独的 堆,而不用默认的堆。 ◼ 在使用结束后要及时释放掉该内存堆