ДИНАМИЧЕСКОЕ ВЫДЕЛЕНИЕ ПАМЯТИ
До сих пор в программе использовались переменные и массивы, создаваемые компилятором языка. Однако при этом не рационально расходуется память. В отличие от статических и автоматических данных, память под которые распределяется компилятором, динамически распределяемая память выделяется программой самостоятельно. Время жизни таких объектов также определяется программой. Память выделяется по мере необходимости и должна освобождаться, как только данные, содержащиеся в ней больше не нужны. Доступ к ней осуществляется при помощи указателей. Функции создания динамических переменных и массивов объявлены в заголовочных файлах <alloс.h>, <stdlib.h>.
1. Функция void* malloc(размер) - выделяет в «куче» n байтов и возвращает указатель на 1-й байт, иначе возвращает 0. Необходимо делать преобразование типов.
void main(void){ char *original=”Исходная строка”; char *copy; copy=(char*)malloc(strlen(original)+1); if(copy==NULL) { puts(“Ошибка выделения памяти”); exit(1); } strcpy(copy,original); cout<<copy<<endl; cout<<original<<endl; free(copy); }
При выделении памяти она не очищается. Размер указывается в байтах. 2. Функция void* calloc(n,size type); long* newmas = (long*)calloc(100,sizeof(long)); первый параметр - количество требуемых ячеек памяти; второй параметр - размеp каждой ячейки. Функция calloc() обнуляет выделенную память.
#define SIZE 128 void main(void) { char *str=(char *)calloc(1,SIZE); if(str==NULL) { puts(“Ошибка выделения памяти”); exit(1); } else { cout<<”Введите строку”; gets(str); cout<<str; free(s); } }
3. void* realloc(void *, n) - изменяет размер ранее выделенного блока памяти. Если дополнительная память выделяется в новом месте оперативной памяти, то уже введенная информация переписывается в новое место. ptr = realloc(nptr, size); где nptr - указатель на ранее выделенный блок; size размер выделяемой памяти.
void main(void) { char *p1, *p2; puts(«Выделяем 128 байт»); p1=malloc(128); if(p1) { puts(“Изменяем размер блока на 256 байтов”); p2=realloc(p1,256); //блок теперь равен 256 байтам } if(p2) free(p2); else free(p1); }
4. void free(void *ptr) - освобождение выделенной памяти. Количество выделенной динамически памяти не может превышать 64 Кбайта - размера одного сектора.
18.1 Операция new и delete в С++
В С++ появились операции выделения динамической памяти и удаления (освобождения) динамической памяти. Операции new и delete выполняют динамическое распределение и отмену распределения памяти, аналогично, но с более высоким приоритетом, нежели стандартные библиотечные функции семейства malloc и free. Упрощенный синтаксис: указатель-имени = new имя <инициализатор-имени>; ... delete указатель-имени; Имя может быть любого типа. new пытается создать объект с типом "имени", распределив (при возможности) sizeof(имя) байт в свободной области памяти (которую также называют "кучей"). Продолжительность существования в памяти данного объекта - от точки его создания и до тех пор, пока операция delete не отменит распределенную для него память. В случае успешного завершения new возвращает указатель нового объекта. Пустой указатель означает неудачное завершение операции (например, недостаточный объем или слишком большая фрагментированность кучи). Как и в случае malloc, прежде чем пытаться обращаться к новому объекту, следует проверить указатель на наличие пустого значения. Возвращаемый указатель будет иметь правильный тип, "указатель имени", без необходимости явного приведения типов. name *nameptr // name может иметь любой тип, кроме функции ... if (!(nameptr = new name)) { errmsg("Недостаточно памяти для name"); exit (1); } ... delete nameptr; //удаление name и отмена выделения //sizeof(name) байтов памяти new, будучи ключевым словом, не нуждается в прототипе.
Операция new с массивами
Если "имя" это массив, то возвращаемый new указатель указывает на первый элемент массива. При создании с помощью new многомерных массивов следует указывать все размерности массива: mat_ptr = new int[3][10][12]; // так можно mat_ptr = new int[3][][12]; // нельзя ... delete [] mat_ptr; //освободить память, занятую массивом, //на который указывает mat_ptr
Инициализаторы с операцией new
Другим преимуществом операции new по сравнению с malloc является возможность инициализации. При отсутствии явных инициализаторов объект, создаваемый new, содержит непредсказуемые данные ("мусор"). Объекты, распределяемые new, за исключением массивов, могут инициализироваться соответствующим выражением в скобках: int_ptr = new int(3); Для очистки выделенной памяти операцией new можно использовать функцию meset(), объявленную в <mem.h>. Ей передаются 3 параметра: адрес очищаемой памяти, символ для очистки, количество байт.
#include <string.h> #include <stdio.h> #include <mem.h> int main(void) { char buffer[] = "Hello world\n"; printf("Буфер до memset: %s\n", buffer); memset(buffer, '*', strlen(buffer) - 1); printf("Буфер после memset: %s\n", buffer); return 0; }
Популярное: Как выбрать специалиста по управлению гостиницей: Понятно, что управление гостиницей невозможно без специальных знаний. Соответственно, важна квалификация... Почему люди поддаются рекламе?: Только не надо искать ответы в качестве или количестве рекламы... Как построить свою речь (словесное оформление):
При подготовке публичного выступления перед оратором возникает вопрос, как лучше словесно оформить свою... ©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (358)
|
Почему 1285321 студент выбрали МегаОбучалку... Система поиска информации Мобильная версия сайта Удобная навигация Нет шокирующей рекламы |