内存管理三

VirtualAlloc 分配的内存是以 4K 为极其小单位、连续的内存地址(但投到真正的外存时它不自然是连的),
前面说了, 它不符合分配小内存(譬如只来几只字节的变量); 局部的变量在 “栈”
中生出先后自动管理,
那么那些全局的稍变量怎么处置吧? 这将用到 “堆”.
9 q% /+ Q1 L, }1 F2 x$ D5 D! A

  • n! q4 O% a  Q5 x0 r3 Y这样看来,
    VirtualAlloc 分配的内存既非是 “栈” 也无是 “堆”; VirtualAlloc
    分配的内存地址是连续的, “堆” 中内容一般是匪总是的, 所以管理 “堆”
    比较辛苦, 它是经过对丝链表的布局方式管理的; 程序可以具备多单 “堆”,
    每一个 “堆” 都见面生一个句柄, 访问 “堆” 中之始末时优先要找到这个 “堆”,
    然后再行遍历链表, 这或者就是是 “堆” 比 “栈” 慢的根本原因.
    % T: Q5 B1 i+ [/ e9 r’ K#
    F——————————————————————————–2 p9 D6 w; y( h$ L0 m7 O, p
    0 g$ j% {! l+ M  K8 I/ c
    以 “堆” 中分配内存(HeapAlloc)前先使起 “堆”(HeapCreate),
    就如程序来默认的 “栈” 一样, 每一个主次还发生一个默认建立的 “堆”(可以据此
    GetProcessHeap 获取之 “默认堆” 的句柄), 我们以 Delphi 中因故到 “堆” 时, 使用的就是是是
    “默认堆”. 如果给程序还灵活地有多独 “堆”, 必须使就此到 API 函数.5 J0 g% Y9 L4 k0 Q

, T. P  l1 g& D( e建立 “堆”
时会同时提交真实内存的, 这当报名大内存时会死缓慢, 所以默认堆也只有 1M, 但
“默认堆” 并不曾界定大小, 它见面冲需要动态增长.* L- e: ]8 k( e1 K# F

! I+ M; g* v4 S; /; o) X’ T有了
“默认堆” 还产生必不可少申请其他的 “堆” 吗? 这只有当差不多线程中才能够体现出, 和
“栈” 不一致, 程序会为每个线程分配一个 “栈区”; 而 “默认堆”
是经过中的备线程公用的, 当一个线程使用 “默认堆” 时, 另一个需要使用
“堆” 的线程就要优先挂于等, 也就算是它不克同时采用; 只有经 API
函数重新树立之私家堆才是互不干涉、最有效率的.5 C” O3 z( E4 r8 u” R& t0 ?
——————————————————————————–; k0 W4 [‘ r# f1 w& r2 A1 b, A

  • o5 R& A! L. D4 d; d3 _先期了解一下
    “堆” 相关的函数.) B’ j2 a* m( D% K% C) I;
    M7 g

  1. //建立堆; 注意起时指定的尺码为是比照页大小(PageSize)对共同的, 譬如指定
    15k, 实际会分配 16K.
  2. HeapCreate(
  3.   flOptions: DWORD;     {堆属性选项, 见下表}
  4.   dwInitialSize: DWORD; {初始尺寸, 单位凡字节;
    该大小会受一直交给到实际的内存}
  5.   dwMaximumSize: DWORD  {最老尺寸, 如果不限量最深价值就是设为 0}
  6. ): THandle;             {返回堆句柄; 失败返回 0, 但如果参数
    flOptions 允许了充分, 失败会回去异常标识}
    1. //flOptions 参数可选值:
  7. HEAP_NO_SERIALIZE        = 1; {非互斥,
    此标记可允许多单线程同时做客此堆}
  8. HEAP_GENERATE_EXCEPTIONS = 4; {当建立堆出错时,
    此标记可激发一个百般并回异常标识}
  9. HEAP_ZERO_MEMORY         = 8; {把分配的外存初始化为 0}
    1. //flOptions 参数指定出 HEAP_GENERATE_EXCEPTIONS 时,
      可能回到的怪:
  10. STATUS_ACCESS_VIOLATION = DWORD($C0000005); {参数错误}
  11. STATUS_NO_MEMORY        = DWORD($C0000017); {内存不足}

复制代码


  1. //销毁堆
  2. HeapDestroy(
  3. hHeap: THandle {堆句柄}
  4. ): BOOL;       {}

复制代码


  1. //从堆中申请内存
  2. HeapAlloc(
  3.   hHeap: THandle; {堆句柄}
  4.   dwFlags: DWORD; {内存属性选项, 见下表}
  5.   dwBytes: DWORD  {申请内存的分寸, 单位凡字节}
  6. ): Pointer;       {返回外存指针; 失败返回 0 或特别,
    情况与成立堆是均等}
    1. //dwFlags 参数可选值:
  7. HEAP_NO_SERIALIZE        = 1; {非互斥,
    此标记可允许多单线程同时做客此堆}
  8. HEAP_GENERATE_EXCEPTIONS = 4; {当建立堆出错时,
    此标记可刺激一个老并赶回异常标识}
  9. HEAP_ZERO_MEMORY         = 8; {把分配的内存初始化为 0}
    1. {能看到这跟堆放的属性选项是同样的; 如果 dwFlags 参数设为 0,
      将使用堆的性; 如果重指定将蒙堆的习性}
  10. {另外: 如果堆是默认堆, 也就算是积词柄来自 GetProcessHeap, dwFlags
    参数会受忽略}

复制代码


  1. //改变堆内存的尺寸, 也即是重新分配
  2. HeapReAlloc(
  3.   hHeap: THandle; {句柄}
  4.   dwFlags: DWORD; {内存属性选项; 该参数比 HeapAlloc 多来一个取舍,
    见下表}
  5.   lpMem: Pointer; {原内存指针}
  6.   dwBytes: DWORD  {新的尺寸}
  7. ): Pointer;       {同 HeapAlloc}
    1. //dwFlags 参数可选值:
  8. HEAP_NO_SERIALIZE          = 1;  {非互斥,
    此标记可允许多独线程同时做客此堆}
  9. HEAP_GENERATE_EXCEPTIONS   = 4;  {当建立堆出错时,
    此标记可刺激一个老并返异常标识}
  10. HEAP_ZERO_MEMORY           = 8;  {把分配的内存初始化为 0}
  11. HEAP_REALLOC_IN_PLACE_ONLY = 16;
    {此标志不同意改变原来的内存位置}

复制代码


  1. //获取堆中某块内存的大小
  2. HeapSize(
  3.   hHeap: THandle; {堆句柄}
  4.   dwFlags: DWORD; {内存属性; 可选值是 0 或 HEAP_NO_SERIALIZE,
    后者可保证联合访问}
  5.   lpMem: Pointer  {内存指针}
  6. ): DWORD;         {成功返回字节为单位的高低; 失败返回 $FFFFFFFF}

复制代码


  1. //释放堆积中指定的外存块
  2. HeapFree(
  3.   hHeap: THandle; {堆句柄}
  4.   dwFlags: DWORD; {内存属性; 可选值是 0 或 HEAP_NO_SERIALIZE}
  5.   lpMem: Pointer  {内存指针}
  6. ): BOOL;          {}

复制代码


  1. //验证堆
  2. HeapValidate(
  3.   hHeap: THandle; {}
  4.   dwFlags: DWORD; {}
  5.   lpMem: Pointer  {}
  6. ): BOOL;          {}

复制代码


  1. //整理堆
  2. HeapCompact(
  3.   hHeap: THandle; {}
  4.   dwFlags: DWORD  {}
  5. ): UINT;          {}

复制代码


  1. //锁定堆
  2. HeapLock(
  3.   hHeap: THandle {}
  4. ): BOOL;         {}

复制代码


  1. //锁定后的解锁
  2. HeapUnlock(
  3.   hHeap: THandle {}
  4. ): BOOL;         {}

复制代码


  1. //列举堆中的内存块
  2. HeapWalk(
  3.   hHeap: THandle;                {}
  4.   var lpEntry: TProcessHeapEntry {}
  5. ): BOOL;                         {}

相关文章