    25:	BrandNew *Ь2 = new BrandNew; 
    26:	BrandNew *b3 = new BrandNew; 
    27:	BrandNew *54 = new BrandNew; 
    28:	BrandNew *Ь5 = new BrandNew; 
    29:	return 0; 
    30:	} 
    31: 
    32:	BrandNew::BrandNew() 
    33:	{ 
    34:	  cout « "\nlnside constructor"; 
    35:	  x = index; 
    36:	}
    37: 
    38:	void *BrandNew::operator new(size_t size) 
    39:	{ 
    40:	  cout « "\nlnside overloaded new. Size == " « size; 
    41:	  if (index >= 512 - sizeof(BrandNew)) 
    42:	     return 0; 
    43:	  else { 
    44:	    int k = index; 
    45:	    index += sizeof(BrandNew); 
    46:.	    return &buf[k]; 
    47:	  } 
    48:	}
 

    Перегрузка delete 

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

    void operator delete(void *p); 

где р ссылается на удаляемый объект. В качестве альтернативы можно объявить 
функцию следующим образом: 

    void operator delete(void *p,  size_t size); 

    В соответствии с вторым объявлением C++ будет дополнительно передавать 
функции число байтов в удаляемом объекте. 
    Для добавления функции перегрузки оператора delete в класс BrandNew в 
модуле OVERNEW (листинг 15.7) объявите функцию-член в открытой секции класса: 

    void BrandNew::operator delete(void *p) 
    {
       cout « "\nDeleting object at " « p; 
    } 

    Оператора вывода отображает адрес каждого удаляемого объекта. Поскольку 
объекты в программе не запоминаются в куче, перегруженный оператор delete на 
самом деле не освобождает никакой памяти. Вам также требуется несколько 
операторов для удаления нескольких объектов. Вставьте следующие строки в 
функцию main() непосредственно перед оператором return: 

    delete Ь2; 
    delete ЬЗ;
    delete b4;
    deiete b5; 

    Запустив программу на выполнение, вы увидите сообщения, в точности, 
указывающие, когда вызывался перегруженный оператор delete. Этот пример 
приведен только для демонстрации, поскольку в полноценном приложении
 перегруженный оператор delete должен освобождать удаленные блоки памяти 
для последующего использовання их перегруженным new. (См. также раздел 
"Размещение объектов по заданным адресам" далее в этой главе.) 

    ЗАМЕЧАНИЕ

   Чтобы испшользовать средства управления памятью C++ для выделения 
пространства в куче для объектов, в которых перегружен оператор new, 
поставьте перед оператором двойное двоеточие. Например, в строке 
BrandNew *х =  ::new BrandNew игнорируется перегруженный в объектах класса 
BrandNew оператор new. Аналогично, ::delete служит для обращения к оператору 
delete, используемому по умолчанию.


    Глава 15. Передовые средства C++     381 
