Deallocation functions shall be class member functions or global
functions; a program is ill-formed if deallocation functions are
declared in a namespace scope other than global scope or declared static
in global scope.
If a deallocation function terminates by throwing an exception, the behavior is undefined.
The value of the first argument supplied to a deallocation function may
be a null pointer value; if so, and if the deallocation function is one
supplied in the standard library, the call has no effect.
If the argument given to a deallocation function in the standard library
is a pointer that is not the null pointer value ([conv.ptr]), the
deallocation function shall deallocate the storage referenced by the
pointer, ending the duration of the region of storage.
The global operator delete(void*, std::size_t)
precludes use of an
allocation function void operator new(std::size_t, std::size_t) as a placement
allocation function ([diff.cpp11.basic]).