    Однако подобное предположение таит в себе опасность, поскольку new и 
delete на самом деле операторы, а не функции. Как операторы, new и delete могут 
перегружаться с целью задания новых возможностей управления памятью для 
объектов класса. С помощью перегрузки new и delete вы можете получить полный 
контроль над операциями выделения памяти объектам. 

    ПРЕДУПРЕЖДЕНИЕ 

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

    Перегрузка оператора new 

    Вы можете перегружать new точно так же, как и операторы, подобные + и =. 
Перегрузка new в объявлении класса указывает компилятору, что отныне на вас 
лежит ответственность за поддержку запросов выделения памяти для объектов 
этого класса. 
    Для перегрузки new следует использовать прототип функции вида 

        void * operator new(size_t size);. 

В дальнейшем обращения к оператору new для выделения памяти объектам класса 
будут перенаправлены перегруженной функции. Функция должна возвращать адрес 
области памяти, выделенной объекту. Если необходимого свободного пространства 
нет, функция должна возвращать null (нуль). 
    В листинге 15.7 приводится простой, но полный пример перегрузки оператора 
new для выделения памяти объектам. Вместо кучи программа запоминает их в 
глобальном буфере. Вы можете применить аналогичный трюк для выделения памяти 
объектам в других местах, например на диске или другом запоминающем устройстве. 

    ЗАМЕЧАНИЕ 

    В строке 6 OVERNEW.CPP приводится команда #pragma warn -aus. Она  
предписывает компилятору выключить предупреждение о том, что в программе не 
используются переменные, объявленные исключительно в демонстрационных целях.

    Функция перегрузки оператора new, объявленная в строке 13 и реализованная 
в строках 38-48, проверяет наличие пространства в глобальном буфере. Если его 
нет, функция возвращает 0, что является основанием для возвращения оператором 
new значения null. (В программе не проверяется это условие, но, конечно, вы 
должны проверять его в реальных приложениях.) Если свободное пространство 
есть, глобальный индекс увеличивается на размер запрашиваемой памяти, который 
передается функции в параметре size. Затем функция возвращает адрес 
выделяемого участка памяти. 

   Листинг 15 7. OVERNEW.CPP (перегрузка new) 

    1:	«include <iostream.h> 
    2: 
    3:	// Следующая директива "pragma" выключает предупреждение компилятора о 
    4:	// том, что в программе объявляются и не используются демонстрационные переменные 
    5: 
    6:	#pragma warn -aus
    7:	
    8:	class BrandNew {            
    9:	private:                                  
    10:	   int x;                                   
    11:	public: 
    12:	   BrandNew () ;
    13:	    void * operator new(size_t size); 
    14:	 };
    15:
    16:	char buf[ 512 ] ;
    17:	int index;
    18: 	
    19:	main()
    20:	{
    21:            cout « "\nCreating local instance";
    22:  	   BrandNew b1;	
    23: 
    24:  	   cout « "\nAllocating space via new"; 


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