I.
if memory allocation succeeds and the Widget constructor throws an exception, the runtime system is responsible for undoing the allocation that operator new performed. The runtime system looks for a version of operator delete that takes the same number and types of extra arguments as operator new.
class Widget {
public:
static void* operator new(std::size_t size, std::ostream& logStream) throw(std::bad_alloc);
static void operator deleted(void* pMemory) throw();
static void operator deleted(void* pMemory, std::ostream& logStream) throw();
};
Widget *pw = new(std::cerr)Widget; // no leak
// if no exception is thrown, the normal operator delete is invoked
delet pw; // invokes the normal operator delete
II.
Operator news in derived classes hide both global and inherited versions of operator new
C++ offers the following forms of operator new at global scope
void* operator new(std::size_t) throw(std::bad_alloc);
void* operator new(std::size_t, void*) throw();
void* operator new(std::size_t, const std::nothrow_t&) throw();
calss StandardNewDeletForms {
public:
// normal new/delete
static void* operator new(std::size_t size) throw(std::bad_alloc) {
return ::operator new(size);
}
static void operator delete(void *pMemory) throw() {
::operator delete(pMemory);
}
// placement new/delete
static void* operator new(std::size_t size, void* ptr) throw() {
return ::opertator new(size, ptr);
}
static void operator delete(void* pMemory, void* ptr) throw() {
return ::operator delete(pMemory, ptr);
}
// nothrow new/delet
static void* operator new(std::size_t size, const std::nothrow_t& nt) throw() {
return ::operator new(size, nt);
}
static void operator delete(void* pMemory,const std::nothrow_t&) throw() {
::operator delete(pMemory);
}
};
class Widget: public StandardNewDeleteForms {
public:
using StandardNewDeleteForms::operator new;
using StandardNewDeleteForms::operator delete;
static void* operator new(std::size_t size, std::ostream& logStream) throw(std::bad_alloc);
static void operator delete(void *pMemory, ostream& logStream) throw();
};