Информатика и технология программирования

         

Работа с динамической памятью в Си


Как нам уже известно, работать с памятью на Си можно как на " высоком уровне" , то есть используя определения типов данных и переменных, так и на " низком" уровне, то есть рассматривая переменные просто как области памяти известной размерности. Соответственно функции работают с динамической памятью " на низком уровне" , операторы - " на высоком" . Функции используются для создания динамических переменных и массивов произвольных типов. Поэтому они "не вникают" в содержание создаваемых структур данных, единственно важным для них является размерность структур данных, выраженная естественным для Си способом в байтах (при помощи операции sizeof). Адрес выделенной области памяти также возвращается в виде указателя типа void* -абстрактный адрес памяти без определения адресуемого типа данных. Рассмотрим объявления основных функций:


void *malloc(int size);
// выделить область памяти размером


// в size байтов и возвратить адрес


void free(void *p);
// освободить область памяти,


// выделенную по адресу p


void *realloc(void *p, int size);
// расширить выделенную область памяти


// до размера size, при изменении адреса


// переписать старое содержимое блока

Пример создания простой динамической переменной:


&#35include &#60alloc.h&#62
double *pd;
pd = malloc(sizeof(double));
if (pd !=NULL)
{
*pd = 5;
free(pd);
}

Заметим, что функции free и realloc не содержат размерности возвращаемой области памяти. Очевидно, что библиотека, управляющая динамической памятью, должна сохранять информацию о размерности (а по возможности, и об адресах) выделенных блоков.

Для более естественной работы с динамическими переменными в Си++ введены также l операторы управления динамической памятью new и delete . Их отличительные особенности :

-при создании динамической переменной в операторе new указывается тип создаваемой переменной, а не размерность, при этом оператор возвращает указатель того же самого типа ;

-если выделяется память под массив динамических переменных, то в операторе new добавляются квадратные скобки (см. ниже " Динамические массивы" ).


double *pd;
pd = new double ; // Обычная динамическая переменная


if (pd !=NULL)
{
*pd = 5;
delete pd;
}
double *pd ; // Массив динамических переменных


pd = new double[20];
if (pd !=NULL)
{
for (i=0; i&#60 20; i++) pd[i]=0;
delete pd;
}



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