Когда создается объект с помощью операции new, для получения свободнойпамяти вызывается (неявно) функция operator new() ($$R.5.3.3). Если функция operator new() не может выполнить запрос, онавозвращает 0. В классе X функция X::operator new() является статическим членом,даже если она не описана явно как static. Первый ее параметр должениметь тип size_t, - зависящий от реализации целочисленный тип,который определен в стандартном заголовочном файле <stddef.h>, иона должна возвращать значение типа void*, например: class X { //... void* operator new(size_t); void* operator new(size_t, Arena*); }; Правила выбора подходящей функции operator new() обсуждаютсяв $$R.5.3.3. В классе X функция X::operator delete() является статическимчленом, даже если она не описана явно как static. Первый ее параметрдолжен быть типа void* и можно добавлять второй параметр типаsize_t. Она не может возвращать какое-либо значение и типвозвращаемого значения должен быть void, например: class X { //... void operator delete(void*); }; class Y { //... void operator delete(void*, size_t); }; В каждом классе можно описать только одну функцию operator delete(),значит эта функция не может быть перегруженной. Глобальная функцияoperator delete() имеет единственный параметр типа void*. Если функция описана с двумя формальными параметрами, она вызываетсяс двумя параметрами, второй из которых показывает размер удаляемогообъекта. Передаваемый размер определяется с помощью деструктора(если он есть) или по типу (статическому) указателя на удаляемыйобъект. Операция пройдет корректно, если тип указателя, заданногокак фактический параметр, будет совпадать с типом объекта (а не будет,к примеру, просто типом указателя на базовый класс) или, еслиэтот тип является типом указателя на базовый класс с виртуальнымдеструктором. Для массивов объектов типа класс используются глобальные функцииoperator new() и operator delete() ($$R.5.3.3, $$R.5.3.4). Поскольку функции X::operator new() и X::operator delete()статические, они не могут быть виртуальными. Функцияoperator delete(), которая вызывается из деструктора для освобожденияпамяти, выбирается по обычным правилам областей видимости,например: struct B { virtual ~B(); void* operator new(size_t); void operator delete(void*); }; struct D: B { ~D(); void* operator new(size_t); void operator delete(void*); }; void f() { B* p = new D; delete p; } В этом примере память для объекта класса D выделяется с помощьюD::operator new(), а благодаря наличию виртуального деструктора,освобождается с помощью D::operator delete().