Системное программирование в UNIX средствами Free Pascal

В результате этого вызова функция


uses stdio;
function malloc(nbytes:longint):pointer;
В результате этого вызова функция malloc обычно возвращает указатель на участок памяти размером nbytes. При этом программа получает указатель на массив байтов, которые она может использовать по своему усмотрению. Если памяти недостаточно и система не может выделить запрошенный вызовом malloc объем памяти, то вызов возвращает нулевой указатель.
Обычно вызов malloc используется для выделения памяти под одну или несколько структур данных, например:
var
  p:^item;
  р := malloc(sizeof(item));
В случае успеха вызов malloc создает новую структуру item, на которую ссылается указатель р. Заметим, что возвращаемое вызовом malloc значение приводится к соответствующему типу указателя. Это помогает избежать вывода предупреждений компилятором или такими программами, как
lint. Приведение типа в данном случае целесообразно, поскольку вызов malloc реализован так, чтобы отводить память под объекты любого типа при условии, что запрашивается достаточный для хранения объекта ее объем. Такие задачи, как выравнивание по границе слова, решаются самим алгоритмом функции malloc. Обратите внимание на то, что размер структуры item задается при помощи конструкции sizeof, которая возвращает размер объекта в байтах.
Функция free противоположна по своему действию функции malloc и возвращает отведенную память, позволяя использовать ее повторно. Функции free передается указатель, который был получен во время вызова malloc:
var
  ptr:^item;
.


.
.
ptr := malloc(sizeof(item));
(* Выполнить какие-либо действия .. *)
free(ptr);
После подобного вызова функции free освобожденный участок памяти, на который указывает ptr, уже нельзя использовать, так как функция malloc может позднее снова его отдать процессу (целиком или частично). Очень важно, чтобы, функции free передавался указатель, который был получен от функции malloc, или от одной из функций calloc и realloc, принадлежащих тому же семейству. Если указатель не удовлетворяет этому требованию, то почти наверняка возникнут ошибки в механизме распределения динамической памяти, которые приведут к некорректной работе программы или к ее аварийному завершению. Неправильное применение функции free – очень часто встречающаяся и трудноуловимая ошибка.[20]
Еще две функции в семействе malloc непосредственно связаны с выделением памяти. Первой из них является функция calloc.


uses stdio;
function calloc(nelem, nbytes:longint):pointer;
Функция calloc отводит память под массив из nelem элементов, размер каждого из которых равен nbytes. Она обычно используется следующим образом:
(* Выделить память под массив структур *)
var
  aptr:^item;
.
.
.
aptr := calloc(nitem, sizeof(item));
В отличие от функции malloc, память, отводимая функцией calloc, заполняется нулями, что приводит к задержке при ее выполнении, но может быть полезно в тех случаях, когда такая инициализация необходима.
Последней функцией выделения памяти из семейства malloc является функция realloc.


uses stdio;
function realloc(oldptr:pointer; newsize:longint):pointer;
Функция realloc используется для изменения размера блока памяти, на который указывает параметр oldptr и который был получен ранее в результате вызова malloc, calloc или realloc. При этом блок памяти может переместиться, и возвращаемый указатель задает новое положение его начала. После изменения размера блока сохраняется содержимое его части, соответствующей меньшему из старого и нового размеров.

Содержание раздела