завершение). Это удобно для небольших демонстрационных программ, но 
неприемлемо для коммерческих приложений. Для того чтобы узнать, как 
обрабатывать эти и другие исключительные ситуации без аварийных завершений, 
следует обратиться к главе 15. 

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

    Хотя MEMERR.CPP демонстрирует, что происходит при нехватке памяти, в 
обычных обстоятельствах эта программа — не лучший пример использования new. 
Например, использование "бесконечного" цикла for — плохой стиль 
программирования, хотя в данном случае необходимо было вызвать ошибку 
выделения памяти независимо от того, сколько оперативной памяти у вашего 
компьютера. Из-за этого цикла компилятор выдает предупреждение о том, что 
оператор return в строке 22 "недостижим". Это предупреждение означает, что 
компилятор обнаружил отсутствие пути, ведущего к выполнению одного или 
нескольких операторов в программе, что указывает на возможно неправильный 
оператор в каком-либо месте программы. 
    В обычных условиях следует использовать new для выделения памяти 
переменным, структурам или массивам, как показано ниже. Например, вы можете 
объявить структуру как в MEMERR: 

    struct q { 
    int ia[1024];	// 2048-байтовая структура 
    }; 

Затем использовать new для выделения памяти для переменной типа q: 

    struct q *qp;	// Объявление указателя на переменную типа структуры q 
    qp =     new q;                    // Выделение памяти для переменной типа структуры q 

    Если new завершился успешно, то qp содержит адрес переменной типа 
структуры q. Вы можете использовать переменную точно так же, как и обычную 
такого же типа. Когда вы завершили использование динамической переменной, 
следует освободить занимаемую ею память с помощью оператора delete. 
Освобожденная память в дальнейшем будет доступна для будущих использований new: 

    delete qp;  // Удаление и освобождение памяти,  адресованной qp 

    Если вы не удалите программную динамическую переменную, вы рискуете 
полностью занять память и в дальнейшем вызвать ошибки, связанные с ее 
нехваткой. В MEMER.CPP, где не удаляется ранее выделенная память, 
демонстрируется неизбежный результат этой серьезной ошибки. 

    ЗАМЕЧАНИЕ 

    При завершении Программы вся наделенная память автоматически 
освобождается. Тем не менее, считается хорошим тоном удалять динамические 
переменные по окончании их использования. 

    Между прочим, всегда неплохо удалять (delete) указатель, даже если он 
равен нулю. Конечно, после удаления указателя память, адресовавшаяся им 
прежде, более не будет зарезервирована для программного использования. 
Удаление того же самого указателя повторно или использование адресованной им 
памяти может вызвать серьезные ошибки. Никогда не делайте так, как показано ниже: 

    double *dp;	// Объявление указателя на вещественное значение 
    dp = new double;	// Выделение памяти и присвоение ее адреса dp 
    *dp = 3.14159;	// Присваивание значения выделенной памяти 
    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! 


    292     Часть III. Программирование на ANSI C++ 
