Четвертый BORLAND С++ и его окружение

       

Динамическое использование свободной памяти (операции 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 для выделения памяти.



Содержание раздела