    Управление памятью с помощью new и delete 

    Вы можете использовать одинаковую технику управления памятью в программах 
на ANSI С и C++. Функции malloc(), farmalloc(), farcalloc(), free(), farfree() и 
другие одинаково доступны для всех программ на С и C++. Однако C++ предлагает 
альтернативные операторы управления памятью new и delete, которые могут делать 
то же самое, что и стандартные функции, и более того. 
    Используйте new для выделения памяти динамическим переменным. Используйте 
free (?!), чтобы освободить память, выделенную new, для ее использования в 
последующих операторах new. Имейте в виду, что new и delete — унарные 
операторы, а не функции. Этот факт важен, поскольку, как вы узнаете в 
следующем разделе, C++ дает возможность переопределять большинство операторов, 
включая new и delete. Использование этих операторов вместо стандартных функций 
управления памятью дает возможность при необходимости самостоятельно 
обрабатывать ситуации управления памятью. Эти операторы также играют важную 
роль в объектно-ориентированном программировании, которому посвящена глава 13. 
    Чтобы выделить память для переменной, имеющей тип double, и присвоить ее 
адрес указателю, вы можете написать 

    double *dp = new double; 

    Вы можете часто видеть схожее объявление, делающее вызов new похожим на 
вызов функции: 

    double *dp = new(double); 

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

    •dp = 3.14159; 

    Закончав использование динамической переменной, удалите ее следующим образом: 

    delete dp; 

    Удаление указателя означает освобождение выделенной ранее памяти, адрес 
которой хранится в dp, для последующего использования. Для освобождения 
памяти, выделенной с помощью new, необходимо использовать только delete. 
Динамические переменные, созданные функцией malloc(), следует уничтожать с 
помощью функции free() (или, возможно, farfree(). Вы можете использовать 
malloc() и new в одной и той же программе, но вы не можете смешивать способы 
управления памятью ANSI С и C++. 

    Обнаружение ошибок, связанных с нехваткой памяти 

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

    •   new возбуждает исключительную ситуацию; 
    •   new возвращает нуль. 

    В старых версиях C++ оператор new в любом случае возвращал нуль в случае 
неудачной попытки выделения памяти, обычно вследствие нехватки свободного 
пространства. В новейших версиях ANSI C++ спецификации языка позволяют new 
возбуждать исключительную ситуацию — прием, который будет объяснен позже, в 
главе 15. Пока вы не узнаете больше о C++, преждевременно говорить об 
исключительных ситуациях, и лучше использовать new как и ранее, 
перепрограммировав его так, чтобы в случае ошибки выделения памяти возвращался нуль. 
    Для этого включите заголовочный файл NEW.H в вашу программу и добавьте 
следующий оператор в main() или в любое другое место до первого использования new: 

    set_new_handleг(0); 

    Функция set_new_handler() устанавливает адрес обработчика (подпрограммы 
времени исполнения), используемой new. Обработчик по умолчанию заставляет new 
возбуждать исключительную ситуацию для ошибок. 

    СОВЕТ

    При переносе имеющихся программ на C++ в среду Borland C++ 4.3, возможно, 
будет необходимо вызвать set_new_haadler( 0 ) в начале программы для обеспечения 
ее правильной работы. Это изменение следует внести в программу в том случае, 
если она непредвиденно завершится с сообщением "abnormal termination" 
(аварийное завершение), которое может быть вызвано возбуждением new 
исключительной ситуации в случае ошибки выделения памяти. 
    

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