6 Basic concepts [basic]

6.7 Storage duration [basic.stc]

6.7.4 Dynamic storage duration [basic.stc.dynamic]

6.7.4.2 Deallocation functions [basic.stc.dynamic.deallocation]

Функции отмены распределения должны быть функциями-членами класса или глобальными функциями; программа плохо сформирована, если функции освобождения объявлены в области имен, отличной от глобальной, или объявлены статическими в глобальной области.

Каждая функция освобождения должна возвращать, 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]).