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.
A deallocation function
is a destroying operator delete
if it has at least two parameters
and its second parameter
is of type std::destroying_delete_t.
A destroying operator delete
shall be a class member function named operator delete.
If the function is a destroying operator delete
declared in class type C,
the type of its first parameter shall be C*;
otherwise, the type of its first
parameter shall be void*.
A deallocation function may have more
than one parameter.
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, 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]).