Динамическое выделение памяти
Программа может хранить информацию в основной памяти компьютера двумя основными способами. Первый из них использует глобальные и локальные переменные, включая массивы, структуры и классы. В случае глобальных и статических локальных переменных место хранения информации фиксируется на все время выполнения программы. В случае локальных переменных память выделяется в стеке. Хотя в Borland С++ работа с этими переменными реализована очень эффективно, их использование требует от программиста знать заранее размер памяти, который потребуется в ходе выполнения программы.
Вторым способом хранения информации служит использование системы динамического выделения памяти Borland С++. В этом методе память для хранения информации выделяется из свободной области памяти по мере надобности и возвращается назад, т.е. освобождается, когда надобность в ней исчезла. Область свободной памяти лежит между областью памяти, где размещается программа, и стеком. Эта область называется кучей (heap) и используется для запросов на динамическое выделение памяти.
Преимуществом использования динамической памяти служит то, что одна и та же память может быть использована для хранения различной информации в процессе исполнения программы. Поскольку память выделяется для определенной цели и освобождается, когда ее использование завершилось, то можно использовать ту же самую память в другой момент времени для других целей в другой части программы. Другим преимуществом динамического выделения памяти является возможность создания с ее помощью связанных списков, двоичных деревьев и других динамических структур данных.
Ядром динамического выделения памяти языка С являются функции malloc() и free(), являющиеся частями стандартной библиотеки. Всякий раз, когда функцией malloc() осуществляется запрос на выделение памяти, выделяется порция имеющейся в наличии свободной памяти. Всякий раз, когда эта память освобождается с помощью функции free(), эта память возвращается назад системе.
Язык С++ определяет два оператора динамического выделения памяти — new и delete.
Стандарт ANSI С определяет только четыре функции динамического выделения памяти: calloc(), malloc(), free() и realloc(). Однако Borland С++ содержит несколько других функций динамического выделения памяти. При компиляции кода для современной 32-разрядной модели памяти, память является плоской и обычно используются только четыре стандартные функции выделения памяти.
Стандарт ANSI С определяет, что заголовочная информация, необходимая для динамического выделения памяти, содержится в файле stdlib.h. Однако Borland С++ позволяет использовать заголовочные файлы stdlib.h или alloc.h. Здесь мы используем заголовочный файл stdlib.h, поскольку это обеспечивает переносимость. Некоторые другие функции динамического выделения памяти требуют заголовочных файлов alloc.h, malloc.h или dos.h. Необходимо обращать особое внимание на то, какой заголовочный файл необходим для использования каждой функции.