Здравствуйте, Alexander G, Вы писали:
AG>Здравствуйте, slava_phirsov,
AG>К уже сказанному можно добавить, что корректное освобождение памяти, выделенной new, при исключении из конструктора — это единственная причина, почему при написании своей версии оператора new следует написать и свою версию оператора delete. Компилятором неявно вызывается особая форма оператора delete только при исключении из конструктора, стейтмент delete p; — это деструктор и стандартный delete.
мне кажется, что вы сморозили чушь
рекомендую перечитать 5.3.4 (new) и 5.3.5 (delete)
в двух словах:
5.3.4.8:
A new-expression obtains storage for the object by calling an allocation function (3.7.3.1) If the new-expression terminates by throwing an exception, it may release storage by calling a deallocation function (3.7.3.2)
5.3.5.7
The delete-expression will call a deallocation function.
Allocation functions — это operator new(), operator new[]() причем implementation provides default definitions of the global allocation functions
Deallocation functions — это operator delete(), operator delete[]() причем implementation provides default definitions of the global deallocation functions
если написать ::new A(), то используется глобальная функция аллокации, если
new A(), то функция operator new() сначала ищется в скоупе A, затем в глобальном скоупе
вывод:
"при написании своей версии оператора new следует написать и свою версию оператора delete" для того, чтобы не было глюков и память очищалась правильно