функции С и C++, библиотек C++Builder, API Windows________________895

Поля TotalAddrSpace, TotalUncommitted и TotalCommitted относятся к па-
мяти, выделенной для программы системой. А поля TotalAllocated и TotalFree
относятся к области динамически распределяемой памяти (в дальнейшем для
краткости будем называть ее heap). Так что для проверки возможностей динами-
ческого выделения памяти надо ориентироваться на TotalAllocated и TotalFree.

Функция SetMemoryManager позволяет пользователю заменить функции,
выделяющие и освобождающие память, своими собственными. Эти функции поль-
зователя задаются полями параметра MemMgr типа TMemoryManage. Структура
типа TMemoryManage имеет поля:

GetMem     Указывает на функцию, выделяющую в памяти блок с заданным
числом байтов Size и возвращающую указатель на выделенный
блок (аналог функции malloc). Параметр Size функции GetMem
не должен быть равен нулю. Если GetMem не может выделить
блок заданного размера, она должна возвращать NULL

FreeMem    Указывает на функцию, освобождающую блок памяти, на кото-
рый указывает ее параметр (аналог функции free). Параметр
функции FreeMem не должен быть равен NULL. Если FreeMem
успешно освободила память, она должна возвращать 0. В против-
ном случае должно возвращаться ненулевое значение

ReallocMem Указывает на функцию, которая изменяет размер блока, на кото-
рый указавает ее параметр, до заданной новой величины Size
(аналог функции realloc). Указатель, передаваемый в функцию
ReallocMem, не должен быть равен NULL, а параметр Size не
должен быть равен 0. Функция ReallocMem должна изменить
размер блока, при необходимости переместив его на новое место,
если нельзя обеспечить требуемый размер на прежнем месте. Ин-
формация, хранившаяся в прежнем блоке, должна быть сохране-
на, но вновь выделяемое пространство может не инициализирова-
ться. Функция должна возвращать указатель на блок или NULL,
если изменить размер блока невозможно

Функции пользователя, которые устанавливаются функцией SetMemoryMa-
nager, могут оперировать с объектами, их конструкторами и деструкторами, стро-
ками и т.п. Функция GetMemoryManager возвращает структуру типа TMemory-
Manager, содержащую указатели на установленные функции. Через поля этой
структуры можно обращаться к установленным функциям.

Приведем пример. Пусть вы хотите вести учет числа обращений к функциям
динамического распределения памяти и учет объемов выделяемой и освобождае-
мой памяти. Это можно сделать следующим кодом:

ttinclude <malloc.h>

TMemoryManager* mmNew;

TMemoryManager* mmOld;

long alloc, dealloc, Nalloc, Ndealloc;

void*   fastcall NewGetMem(int Size)
{

alloc += Size;

Nalloc++;

return mm01d->GetMem(Size);