Системное программирование в 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.




- Начало -  - Назад -  - Вперед -



Книжный магазин