Здавалка
Главная | Обратная связь

Delete dp; // Удаление выделенной памяти. Пока все хорошо



*dp = 9.9999; // ??? Серьезная ошибка! Не делайте этого!

delete dp; // ??? Серьезная ошибка! Разрушает кучу

Приведенный фрагмент корректен, исключая два последних оператора. После удаления dp нельзя повторно использовать указатель, поскольку удаленная память может быть зарезервирована для другой переменной. По­вторное удаление указателя, как это произошло в последнем операторе, — также серьезная ошибка, так как это может повредить кучу, дважды добавив один и тот же блок памяти в список свободного пространства в этой об­ласти. Обязательное правило — удалив указатель, никогда не используйте его повторно ни для каких целей. Конечно, вы можете повторно использовать указатель для адресации памяти заново выделенной new:

dp = new double; // Выделение памяти для динамической переменной

*dp = 3.14159; // Присваивание значения динамической переменной

delete dp; // Удаление памяти. Не используйте dp после этого!

dp = new double; // Конечно, вы можете выделить память для еще одной

// переменной

*dp = 9.9999; // Присваивание значения заново выделенной переменной

delete dp; // Удаление памяти. Опять же, не используйте затем dp!

 

Использование динамических строк

Вы можете использовать new для выделения динамической символьной строки практически любого разме­ра. Листинг 1.11 демонстрирует, как это делается.

Листинг 1.11. NEWSTR.CPP (объявление строк с помощью new)

1: #include <iostream.h>

2:

Define SIZE 80

4:

Main()

6: {

7: char *sp;

8:

9: sp = new char[SIZE];

10: cout « "String?";

11: cin.getline(sp, SIZE);

12:' cout « "You entered:" « sp « '\n';

13: delete[] sp;
14: return 0;

15: }

Строка 9 вьщеляет символьный массив размером SIZE в байтах и присваивает адрес первого байта этого мас­сива sp. Строки 10-12 демонстрируют использование динамических строк, запрашивая и выводя строку текста.

Строка 13 удаляет динамический символьный массив. Borland С++ разрешает написать этот оператор без скобок следующим образом:

delete sp; // ???, но безопасно в Borland C++

Следуя более строгому протоколу С++, необходимо использовать пустые скобки в выражении delete[], указывающие компилятору, что удаляется массив, а не простая переменная. (В Borland C++ скобки необходи­мы только в том случае, если удаляется массив классовых объектов, но об этом позже.)

В ранних версиях С++ при удалении массива нужно было указывать количество элементов. В С++ вер­сии 2.0, например, строка 15 имела бы вид delete[SIZE] sp;. Borland С++ игнорирует SIZE в таком случае и выдает предупреждение о попытке использовать устаревшую форму delete.







©2015 arhivinfo.ru Все права принадлежат авторам размещенных материалов.