Функции отмены распределения должны быть функциями-членами класса или глобальными функциями; программа плохо сформирована, если функции освобождения объявлены в области имен, отличной от глобальной, или объявлены статическими в глобальной области.
Каждая функция освобождения должна возвращать, void и ее первый параметр должен быть void*. Функция освобождения может иметь более одного параметра. A usual deallocation function - это функция освобождения, которая имеет:
ровно один параметр; или
ровно два параметра, тип второго - либо std::align_val_t или std::size_t39; или
ровно три параметра: тип второго существа std::size_t и тип третьего существа std::align_val_t.
Функция освобождения может быть экземпляром шаблона функции. Ни первый параметр, ни тип возвращаемого значения не должны зависеть от параметра шаблона. [ Note: То есть шаблон функции освобождения должен иметь первый параметр типа void* и тип возвращаемого значения void (как указано выше). ] Шаблон функции освобождения должен иметь два или более функциональных параметра. Экземпляр шаблона никогда не является обычной функцией освобождения, независимо от его сигнатуры. — end note
Если функция освобождения завершается выдачей исключения, поведение не определено. Значение первого аргумента, предоставленного функции освобождения, может быть значением нулевого указателя; если это так, и если функция освобождения предоставлена в стандартной библиотеке, вызов не имеет никакого эффекта.
Если аргумент, переданный функции освобождения в стандартной библиотеке, является указателем, который не является указателем, null pointer valueфункция освобождения должна освободить память, на которую ссылается указатель, завершив продолжительность области хранения.
Глобальное значение operator delete(void*, std::size_t) исключает использование функции распределения void operator new(std::size_t, std::size_t) в качестве функции распределения размещения ([diff.cpp11.basic]).