Работа с памятью в с
Функции для работы с памятью располагаются в библиотеках С: Dos.h, Alloc.h, Stdlib.h, Malloc.h.
Описание основных функций для работы с памятью:
calloc (stdlib.h, alloc.h) предоставляет доступ к куче (heap), которая доступна для динамического распределения по произвольным блокам памяти. Многие структуры данных (например, деревья и списки) используют кучу (heap) для размещения. Функция размещает в памяти блок соответствующего размера и возвращает указатель на созданный блок. Максимальный размер блока – 64Кб. Для блоков большей размерности используется функция farcalloc.
free (stdlib.h, alloc.h) освобождает блок памяти, выделенный ранее с помощью функции calloc. Для функции farcalloс – соответственно farfree.
allocmem (dos.h) использует вызов DOS для выделения блока свободной памяти и возвращает адрес начала сегмента выделенного блока памяти.
freemem (dos.h) освобождает блок памяти, выделенный с помощью allocmem.
alloca (malloc.h) выделяет некоторый объем памяти в стеке. Стек автоматически освобождается после завершения работы вызывающей функции.
Другие функции, описанные в указанных библиотеках, по сути аналогичны вышеописанным за исключением некоторых особенностей использования.
Использование динамических переменных в С++
В языке программирования С++ для динамического распределения памяти существуют операции new и delete. Операция
new имя_типа или new имя_типа (инициализатор)
позволяет выделить и сделать доступным свободный участок в основной памяти, размеры которого соответствуют типу данных, определяемому именем типа. В выделенный участок заносится значение, определяемое инициализатором, который не является обязательным элементом. В случае успешного выполнения new возвращает адрес начала выделенного участка памяти. Если участок нужных размеров не может быть выделен (нет памяти), то операция new возвращает нулевое значение адреса (NULL). Синтаксис применения операции:
указатель = new имя_типа (инициализатор);
Операция new float выделяет участок памяти размером 4 байта. Операция new int(15) выделяет участок памяти 2 байта и инициализирует этот участок целым значением 15. Синтаксис использования операций new и delete предполагает применение указателей. Предварительно каждый указатель должен быть определен:
тип *имя_указателя;
В качестве типа можно использовать, например, стандартные типы int, long, float, double, char.
В качестве имени типа в операции new может быть использован массив:
new тип_массива
При выделении динамической памяти для массива его размеры должны быть полностью определены.
ptr = new int [10]; /* 10 элементов типа int, или 20 байт */
ptr = new int [ ]; /* неверно, т.к. не определен размер */
Такая операция позволяет выделить в динамической памяти участок для размещения массива соответствующего типа, но не позволяет его инициализировать. В результате выполнения операция new возвратит указатель, значением которого служит адрес первого элемента массива.
Для освобождения выделенного операцией new участка памяти используется оператор:
delete указатель;
Указатель адресует освобождаемый участок памяти, ранее выделенный с помощью операции new. Для освобождения памяти, выделенной для массива, используется следующая модификация того же оператора:
delete [ ] указатель;
