Динамическое использование свободной памяти (операции new и delete)
В данном разделе мы рассмотрим объекты, создаваемые на этапе вы-
полнения. Память для них выделяется из области свободной памяти. Метод создания динамических объектов очень важен для многих прикладных
задач, где объем хранимых в памяти данных неизвестен заранее перед
запуском программы. Примером может служить программа произвольной базы данных, которая для быстрого доступа хранит в памяти записи различного размера.
Хотя в С++ можно использовать функции динамического распределения памяти языка Си, такие, как malloc, однако, С++ содержит некоторые мощные расширения, которые облегчают и делают более надежным динамическое распределение и освобождение объектов.
Речь идет о функциях, которые можно использовать для распределения динамической памяти, - new и delete. Работа с этими функциями
строится в стиле операций:
операция new
v
double *d = new double;
delete d;
^
операция delete
Важность операции new заключается в возможности следить за размерами выделяемой памяти, в соответствии с используемыми типами. Без
вспомогательной информации, из вышеприведенного примера ясно, что выделено восемь байт для указателя типа double.
Сравните функции new и delete с функциями Си malloc() и free():
В Си указывается
размер C++ (размер не указывается)
v
double *d = malloc(8); double *d = new double;
free(d); delete d;
char *q = malloc(sizeof(int)*10); char *q = new int[10];
free(q); delete[10] q;
Если память выделяется для массива, а не для типа данных со
стандартной длиной, то используется следующий синтаксис:
new объект[размер]
Например, чтобы динамически выделить память для массива из 100
целых чисел с именем counts, используйте вызов:
counts = new int [100];
Использование new и delete не только надежней, но и удобней. Они
автоматически могут вызываться конструкторами и деструкторами.
Однако, если динамический объект создан с помощью оператора new,
то программист несет ответственность за его освобождение, так как С++
"не знает", нужен ли еще этот объект. Для освобождения памяти можно
использовать оператор delete. При выполнении оператора delete вызывается любой определенный вами деструктор.
Еще раз уточним, что delete имеет следующий синтаксис:
delete указатель;
где "указатель" - это указатель, который использовался в операторе
new для выделения памяти.