Динамическое выделение памяти с помощью библиотечной функции malloc состоит из следующих
шагов.
1. Включение в программу файла заголовков
malloc.h директивой #include <malloc.h>.
2. Объявление указателя нужного типа,
например int *p;
3. Вызов функции malloc с указанием в качестве параметра
требуемого количества памяти в байтах. Так как функция выдает результат своей
работы в виде указателя на тип void,
выполняется приведение типа (преобразуется тип результата к типу, указанному в
объявлении). Присваивается полученное значение объявленному указателю. Пример:
p=(int *)
malloc (число элементов
массива*sizeof(int));
Вместо int может быть подставлен любой стандартный или введенный
программистом тип.
4. Проверка факта выделения памяти. Если
выделение памяти в нужном объеме невозможно, функция malloc возвращает в качестве своего
результата нулевой указатель NULL,
соответствующий значению ложь. Если выделение памяти выполнено, продолжаем
выполнение программы, если нет, выходим из нее с соответствующей диагностикой о
недостатке памяти. Пример:
if (!p)
сообщение, выход; else
продолжение;
5. Освобождение памяти после окончания
работы с ней. Для этого вызываем функцию fгее и используем указатель в качестве аргумента:
free (p);
Значение указателя, полученное после
выполнения шага 3, должно сохраняться до выполнения шага 5. В противном случае
вся память, выделенная по этому адресу, будет потеряна при выходе из программы,
что, в конечном счете, может привести к недостатку памяти и нарушению работы
операционной системы.
Наиболее частой причиной «зависания»
компьютера при работе с динамически выделяемой памятью является несоответствие
инструкций malloc и free (в обеих инструкциях
должен использоваться один и тоже указатель) или недостаточный объем свободной
памяти.
В качестве примера рассмотрим ввод/вывод
одномерного динамического массива произвольной длины, задаваемой с клавиатуры.
int i,n,*massiv; //объявление указателя
cout<<RUS("Введите
размер массива\n");cin>>n;//ввод размера массива
massiv=(int*)malloc(n*sizeof(int)); //выделение
динам.памяти
if(!massiv) //проверка
факта выделения памяти
{cout<<RUS("\nНедостаточно памяти");
cout<<RUS("\nНажмите любую клавишу для завершения
программы ...\n");
getch();
return 0;}
cout<<RUS("Введите массив\n");
for(i=0;i<n;i++)cin>>massiv[i]; //ввод
массива
cout<<RUS("\nmassiv\n");
for(i=0;i<n;i++)cout<<' '<<massiv[i]; //вывод массива
free(massiv); //освобождение памяти
В этой программе указатель используется
только для выделения динамической памяти. Далее в программе обращение к
элементам массива осуществляется через имя массива, которое совпадает с именем
указателя.
Для динамического выделения памяти можно
также использовать функцию calloc(
). В отличии от malloc
функция calloc кроме
выделения области памяти под массив объектов еще производит инициализацию
элементов массива нулевыми значениями.
В зависимости от используемой версии C++
для работы с большими фрагментами динамической памяти возможно применение
функций farmalloc( ), farcalloc( ), farcoreleft( ) и farfree().
|