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; 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 Все права принадлежат авторам размещенных материалов.
|