Программирование на C и C++

Онлайн справочник программиста на C и C++

heapwalk, farheapwalk, _rtl_heapwalk

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 содержат три поля: указатель на блок, размер блока и флаг, который устанавливается в случае использования блока. Эти структуры показаны ниже:

struct 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(), за исключением того, что она ис­пользует следующую структуру:

typedef struct _heapinfo {
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;
}