Память для хранения данных может выделяться статически и динамически. Статическое распределение памяти выполняет компилятор, встретивший при компиляции имя объекта по типу и другим характеристикам, он вычисляет число байтов памяти, отводимое под данные. Класс хранения задаёт местами (сегмент данных или стек), где эти данные будут располагаться. Часто заранее неизвестно, сколько программа будет хранить объектов, а именно строк текста, чисел и т.д. В этом случае для хранения данных может использоваться специальное место, так называемая куча heap. Объём кучи и её месторасположение зависят от модели памяти. Ряд функций выполняют динамическое распределение памяти.
Функции библиотеки Borland C++ для динамического распределения памяти
Функции распределения
| Соответствующая функция освобождения
| Соответствующая функция перераспределения
|
Malloc
| Free
| Realloc
|
Calloc
| Free
| Realloc
|
Farmalloc
| Farfree
| Farrealloc
|
Farcalloc
| Farfree
| Farrealloc
|
При каждом обращении к функции распределения памяти выделяется запрошенное число байтов. Адрес начала выделенной памяти возвращается в точку вызова функции. Распределение памяти гарантируется от повторного выделения при следующих обращениях за байтами памяти. Если выделенный участок памяти больше не требуется, он может быть освобождён при высокой активности по динамическому распределению памяти, куча фрагментируется для смягчения отрицательных последствий фрагментации служат функции повторного распределения памяти. Они пытаются либо уменьшить, либо расширить размер ранее выделенного блока памяти. Модели памяти TINY, SMALL, MEDIUM включают 2 кучи: near-кучу и far-кучу. Остальные модели памяти имеют только TINY, SMALL, MEDIUM. Объём near-кучи не превышает 64 кБайт, far-куча занимает всю свободную оперативную память. Функции malloc, calloc, free, realloc используют near-кучу для моделей памяти TINY, SMALL, MEDIUM. Для других моделей памяти используются far-куча. С ней работают функции с префиксом far. Их поведение для модулей памяти COMPACT и старше не отличается от функций malloc, calloc. И те и другие функции черпают память из одной и той же кучи и возвращают far указатели на начало выделенных участков памяти. При использовании модулей SMALL, MEDIUM доступ к выделенной far-кучи памяти требует явного описания указателя как far. Для Borland C++, для динамического выделения и освобождения памяти использует также операторы new delete.