К уже сказанному можно добавить, что корректное освобождение памяти, выделенной new, при исключении из конструктора — это единственная причина, почему при написании своей версии оператора new следует написать и свою версию оператора delete. Компилятором неявно вызывается особая форма оператора delete только при исключении из конструктора, стейтмент delete p; — это деструктор и стандартный delete.