При удалении динамических массивов используется специальная форма оператора delete для массивов, т.е. delete[]:
delete [] //указатель на динамический массив;
Таким образом, мы сообщаем процессору, что ему нужно очистить память от нескольких переменных вместо одной. Самая распространённая ошибка, которую совершают новички при работе с динамическим выделением памяти, является использование delete вместо delete[] для удаления динамических массивов. Использование формы оператора delete для переменных для удаления массива приведёт к неожиданным результатам: повреждение данных, утечка памяти, сбой или другие проблемы.
Пример.
// пример использования операции delete:
delete ptrvalue;
// где ptrvalue – указатель на выделенный участок памяти типа int
// delete – операция высвобождения памяти
Пример.
#include <iostream>
int main()
{
int n = 5; // размер массива
int *p = new int[n]{ 1, 2, 3, 4, 5 }; // массив состоит из чисел 1, 2, 3, 4
for (int *q = p; q!= p + n; q++)
{
std::cout << *q << "\t";
}
std::cout << std::endl;
|
|
delete [] p;
return 0;
}
Итак, в С++ операции new и delete предназначены для динамического распределения памяти компьютера. Операция new выделяет память из области свободной памяти, а операция delete высвобождает выделенную память. Выделяемая память после её использования должна высвобождаться, поэтому операции new и delete используются парами. Даже если не высвобождать память явно, то она освободится ресурсами операционной системы по завершению работы программы. Рекомендую все-таки не забывать про операцию delete.
Инициализация динамического массива
Если вы хотите инициализировать динамический массив значением 0, то всё довольно просто:
int *array = new int[length]();
До C++11 не было простого способа инициализировать динамический массив ненулевыми значениями (список инициализаторов работал только с фиксированными массивами). А это означает, что нужно перебрать каждый элемент массива и присвоить ему значение явным указанием:
array[0] = 9;
array[1] = 7;
array[2] = 5;
array[3] = 3;
array[4] = 1;
Получается довольно много действий.
Однако, начиная с C++11, появилась возможность инициализации динамических массивов через списки инициализаторов:
int fixedArray[5] = { 9, 7, 5, 3, 1 }; // инициализируем фиксированный массив
int *array = new int[5] { 9, 7, 5, 3, 1 }; // инициализируем динамический массив