В языке С++ для захвата и освобождения памяти используется более простой механизм – операции new и delete. Рассмотрим эти операции на простых примерах:
1) type *p = newtype (значение); – захват участка памяти размером sizeof(type), путем установки на него указателя, и запись в эту область указанного значения;
. . .
deletep; – освобождение захваченной памяти.
2) type *p = newtype[n]; – захват памяти на n последовательно размещенных объектов, возвращает указатель на начало участка ОП размером n*sizeof(type); используется для создания массива;
. . .
delete []p; – освобождение всей захваченной памяти.
Следует заметить, что операция delete не уничтожает значения, находящиеся по указанным адресам, а дает компилятору разрешение использовать ранее занятую память в дальнейшем.
Квадратные скобки в операции delete [ ] при освобождении памяти, занятой массивом, обязательны. Их отсутствие может привести к непредсказуемым результатам.
Пример создания одномерного динамического массива
Для примера приведем участок кода программы для одномерного динамического массива с использованием операций new и delete.
Напомним, что результатом операции new является адрес начала области памяти для размещения данных, указанного количества и типа. При нехватке памяти результат равен NULL.
¼
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; // Освобождение памяти
¼
Пример создания двухмерного динамического массива
Напомним, при создании двухмерного динамического массива сначала выделяется память на указатели, расположенные последовательно друг за другом, а затем каждому из них выделяется соответствующий участок памяти под элементы.
. . .
int **m, n1, n2, i, j;
puts(" Введите размеры массива (строк, столбцов): ");
scanf(“%d%d”, &n1, &n2);
m = new int*[n1]; // Захват памяти для указателей – А (n1=3)
for (i=0; i<n1; i++) // Захват памяти для элементов