Прогулка по куче

В данном примере иллюстрируется использование функции HeapWalk для вывода информации о всех блоках, содержащихся в куче. Информация выводится в следующем формате:

Колонка Описание Поля структуры TProcessHeapEntry

Address

Адрес блока. Адреса блоков, которые имеют атрибут PROCESS_HEAP_REGION и которые содержит информацию о регионе памяти, которым владеет куча, и в которых содержится другие фрагменты, сдвинута вправо.

lpData

Size

Размер фрагмента памяти

cbData

Address

Размер служебной информации

cbOverhead

I

Индекс региона

iRegionIndex

Flags

Атрибуты региона:
RPROCESS_HEAP_REGION
UPROCESS_HEAP_UNCOMMITTED_RANGE
BPROCESS_HEAP_ENTRY_BUSY
MPROCESS_HEAP_ENTRY_MOVEABLE
SPROCESS_HEAP_ENTRY_DDESHARE

wFlags

Rem

Оставшиеся параметры, специфичные для указанных атрибутов.

hMem, dwCommittedSize, dwUnCommittedSize, lpFirstBlock, lpLastBlock

Вот типичный вывод данного примера на экран (для основной кучи процесса):

  Address      Size Head I  Flags Rem
==============================================================
  130640          0  60  0  R---- 36864 1011712 $130688 $230000
    130688     6144   8  0  --B--
    131E90       36  12  0  --B--
    131EC0       72   8  0  --B--
    131F10       34  14  0  --B--
    131F40       72   8  0  --B--
    131F90       56   8  0  --B--
    131FD8     1064  16  0  -----
    132408       26  14  0  --B--
    132430       62  10  0  --B--
    132478       72   8  0  --B--
    1324C8       16   8  0  --B--
    1324E0       22  10  0  --B--
    132500       58  14  0  --B--
    132548       72   8  0  --B--
    132598       20  12  0  --B--
    1325B8       56   8  0  --B--
    1325F8       72   8  0  --B--
    132648       26  14  0  --B--
    132670       62  10  0  --B--
    1326B8       72   8  0  --B--
    132708       22  10  0  --B--
    132728       58  14  0  --B--
    132770       72   8  0  --B--
    1327C0       26  14  0  --B--
    1327E8       62  10  0  --B--
    132830       72   8  0  --B--
    132880       20  12  0  --B--
    1328A0       56   8  0  --B--
    1328E0       72   8  0  --B--
    132930       32   8  0  --B--
    132958        4  12  0  --B--
    132968        8   8  0  --B--
    132980       16  16  0  -----
    132998       34  14  0  --B--
    1329C8       18  14  0  --B--
    1329E8      696   8  0  --B--
    132CA8      788  12  0  --B--
    132FC8      788  12  0  --B--
    1332E8       36  12  0  --B--
    133318       36  12  0  --B--
    133348       60  12  0  --B--
    133398       24  16  0  -----
    1333B8     2344   8  0  --B--
    133CF0      472  16  0  -----
    133ED0     2344   8  0  --B--
    134800        8   8  0  --B--
    134810       68  12  0  --B--
    134860        1  15  0  --B--
    134870       16   8  0  --B--
    134888       18  14  0  --B--
    1348B0      128  16  0  -----
    134938     4088   8  0  --B--
    135940     1024  16  0  -----
    135D48     4088   8  0  --B--
    136D48     1604  12  0  --B--
    1373A0     1264  16  0  -----
    137898     2000   8  0  --B--
    138078     3976  16  0  -----
    139000  1011712   0  0  -U---
==============================================================

Как видно из приведенного выше примера, в среднем для описания фрагмента памяти требуется 8 - 16 байт. Как мы увидим позже, в случае менеджера памяти Delphi на описание каждого блока уходит в среднем от 4 до 8 байт.

Ссылка на пример

НазадСоздание класса для работы с кучей СправочникВперед

© Mystic, 2002