894_____________________________________________Глава 14

шает приложение. Но имеется возможность заменить функцию по умолчанию
своей функцией. Если происходит возврат из этой функции, то делается повторная
попытка динамически выделить память.

Установка новой функции, на которую указывает _new_handler, производит-
ся функцией set_new_handler. Вариант этой функции set_new_handler(0) уста-
навливает функцию по умолчанию. Собственная функция не получает никаких па-
раметров и не возвращает никакого значения. Она может выполнять одно из сле-
дующих действий:

• вернуться после освобождения памяти (тогда будет сделана повторная попыт-
ка выделить память)

• сгенерировать исключение типа bad_alloc или одного из производных от
bad_alloc классов

• завершить приложение функциями abort или exit

Функция set_new_handler возвращает указатель на прежнюю функцию. Это
можно использовать для последующего ее восстановления. Таким образом, вызов
функции установки может иметь вид:

pvf set_new_handler(pvf p) ;

Функция THeapStatus заносит информацию о состоянии памяти в структуру
типа THeapStatus, содержащую поля:

TotalAddrSpace   Общее текущее адресное пространство в байтах, доступное
программе. Увеличивается по мере увеличения динамиче-
ски распределяемой памяти

TotalUncommitted Общее число байтов в TotalAddrSpace, которое не выделе-
но для своппируемого файла

TotalCommitted   Общее число байтов в TotalAddrSpace, которое выделено
для своппируемого файла. Справедливо соотношение Tota-
lUncommitted + TotalCommitted = TotalAddrSpace

TotalAllocated    Объем в байтах динамически выделенной в программе об-
ласти памяти

TotalFree         Полное число байтов, доступное для программы. Если это
число превышается и доступно достаточно виртуальной па-
мяти, то OS увеличивает доступное адресное пространство.
Соответственно увеличивается и TotalAddrSpace

FreeSmall        Число байтов небольших блоков памяти, которые могут
быть еще выделены вашей программе

FreeBig          Число байтов больших блоков памяти, которые могут быть
еще выделены вашей программе. Большие свободные блоки
могут создаваться объединением смежных малых свобод-
ных блоков или динамическим выделением большого блока

Unused           Общее число байтов, которые не могут использоваться про-
граммой. Справедливо соотношение: Unused + FreeBig +
FreeSmall = TotalFree

Overhead         Число байтов, требуемое диспетчером динамически распре-
деляемой памяти для управления всеми блоками

HeapErrorCode    Индикатор внутреннего состояния динамически распреде-
ляемой памяти