[H-L-L.ru] |
Форма входа |
Меню сайта |
Главная » Статьи » Лекции по C++ » 6. Указатели.Динамическое распределение памяти |
Динамическое выделение памяти с помощью библиотечной функции 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(). Источник: malloc free динамическое выделение памяти | |
Всего комментариев: 0 | |