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 ([basic.compound]), the
deallocation function shall deallocate the storage referenced by the
pointer, ending the duration of the region of storage.