int heapwalk(struct heapinfo *hinfo)
int farheapwalk(struct farheapinfo *hinfo)
int _rtl_heapwalk(_HEAPINFO *hinfo)
Прототип функции _rtl_heapwalk() содержится в файле malloc.h. Эти функции не определены стандартом ANSI С и являются специфическими для Borland С++.
Функции heapwalk() и farheapwalk() заполняет структуру, на которую указывает параметр hinfo. Каждый вызов функции heapwalk() или farheapwalk() вызывает переход к следующему узлу в куче и возвращает информацию об этом узле. Когда в куче не осталось больше узлов, возвращается величина _HEAPEND. Если куча отсутствует, то возвращается значение _HEAPEMPTY. Всякий раз, когда анализируется действительный блок, возвращается значение _НЕАРОК.
Функция heapwalk() работает с ближней кучей, а функция farheapwalk() — с дальней.
Структуры heapinfo и farheapinfo содержат три поля: указатель на блок, размер блока и флаг, который устанавливается в случае использования блока. Эти структуры показаны ниже:
void huge *ptr; /* указатель на блок */
insigned long size; /* размер блока в байтах */
int in_use; /* установлен, если блок используется */
};
struct heap_info {
void huge *ptr; /* указатель на блок */
unsigned long size; /* размер блока в байтах */
int in_use; /* установлен, если блок используется */
};
При первом вызове любой из функций необходимо установить поле ptr равным значению NULL, прежде чем вызывать функции heapwalk() или farheapwalk().
В силу того способа, которым Borland С++ организует систему динамического выделения памяти, размер выделенного блока памяти несколько больше запрошенного количества памяти.
При использовании этих функций предполагается, что куча не повреждена. Надо всегда вызывать функции heapcheck() или farheapcheck(), прежде чем вызывать функции обхода кучи.
Функция _rtl_heapwalK() аналогична функции heapwalk(), за исключением того, что она использует следующую структуру:
int *_pentry; /* указатель на блок */
int * __pentry; /* указатель на блок */
size_t _size; /* размер блока */
int _useflag; /* содержит _USEDENTRY, если блок используется, содержит _FREEENTRY, если блок свободен */
} _HEAPINFO;
В дополнение к значениям, возвращаемым функцией heapwalk(), функция _rtl_heapwalk() может возвращать значение _HEAPBADNODE (ошибка найдена в куче) или _НЕАРВАDРТR (_pentry недействителен).
#include <stdio.h>
#include <stdlib.h>
#include <alloc.h>
int main(void)
{
struct heapinfo hinfo;
char *p1, *p2;
if ((p1 = (char *) malloc(80)) == NULL) exit(1);
if ((p2 = (char *) malloc(20)) == NULL) exit(1);
if (heapcheck () < 0) { /* всегда следует проверять кучу */
printf("Heap corrupt.");
exit(1);
}
hinfo.ptr = NULL; /* установка ptr в NULL перед первым вызовом */
/* исследование первого блока */
if(heapwalk(&hinfo) == _НЕАРОК)
printf("Size of p1 's block is %d\n", hinfo.size);
/* исследование второго блока */
if (heapwalk(&hinfo) == _HEAPOK)
printf("Size of p2 's block is %d\n", hinfo.size);
free(p1);
free(p2);
return 0;
}