double arrow

Создание одномерного динамического массива


Динамическое выделение и освобождение памяти.

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

В процессе работы программы автоматически выделяется место в памяти для всех ее объектов. Как будет показано ниже, иногда требуется явно указать момент выделения памяти для некоторых объектов и размер выделяемой под них памяти.

Динамическое (т.е. осуществляемое в процессе работы программы) выделение памяти означает:

1) поиск свободного (т.е. не занятого пока никаким объектом) участка памяти требуемого размера;

2) объявление его занятым (чтобы никакая последующая операция выделения памяти не назначила его другому объекту);

3) присваивание его адреса какому-либо указателю, через который в дальнейшем будет осуществляться работа с этим участком.

Динамическое выделение памяти называется также ее захватом.

Если в процессе работы динамически выделенная память оказывается больше не нужной, рекомендуется ее освободить, т.е. объявить доступной для других возможных операций выделения памяти. При завершении работы программы вся выделенная ей память освобождается автоматически.




Для работы с динамической памятью в С++ введены две операции:

захват памяти - new,

освобождение захваченной ранее памяти - delete.

В языке С размерность массива при объявлении должна задаваться константным выражением. При необходимости работы с массивами перемен­ной размерности нужно объявить вместо массива указатель требуемого типа, а затем в момент необходимости выделить память под массив нужного размера. Таким образом, размер массива в любом случае должен быть указан до начала работы с ним; но при динамическом выделении памяти он указывается не в тексте программы, а непосредственно при захвате памяти, и поэтому может определяться значением переменной.

Формат операции new для массивов:

указатель = new тип [количество] ;

Результат операции new, присваиваемый указателю – адрес начала области памяти для размещения данных указанного количества и типа. При нехватке памяти – результат NULL.

Формат операции delete:

delete указатель;

либо: delete [] указатель; (эти записи равносильны)

После выделения памяти с этим массивом можно работать, аналогично работе с обычным массивом, используя вышеописанную операцию косвенной адресации [].

Пример:

...

double *x;

int i, n;

...

puts(" Введите размер массива: ");

scanf(“%d”, &n);

x = new double [n] ;

if (x == NULL) {

puts(" Предел размерности ! ");

return;

}

for (i=0; i<n; i++) // Ввод элементов массива

scanf(“%lf”, &x[i]); // Косвенная адресация

...

delete [ ]x; // Освобождение памяти

...







Сейчас читают про: