С++ требуется обработать nullptr в пользовательских и специфических для класса операторах удаления.?

Требуется ли для пользовательских и класс-операторов удаления игнорировать nullptr, как это делают операторы из стандартной библиотеки?


parallel discussion в группах google.

Ответы

Ответ 1

Из [expr.delete],

Если значение операнда delete-expression равно null значение указателя, неуказано, будет ли вызвана функция деаллоляции, как описано выше.

Таким образом, для вашего оператора nullptr вам нужно, чтобы ваши пользовательские или классные операторы удаления обрабатывали.

В другом месте в [class.free] при описании функций освобождения для классов классы с виртуальными деструкторами могут иметь функцию дезадаптации, называемую на основе динамического типа. В этом случае функция освобождения не потребуется проверять на nullptr.

Ответ 2

Из [basic.stc.dynamic]:

Любые функции распределения и/или освобождения, определенные в программе на С++, включая версии по умолчанию в библиотеки, должны подтвердить семантику, указанную в пунктах 3.7.4.1 и 3.7.4.2.

Из [basic.stc.dynamic.deallocation]:

Значение первого аргумента, переданного функции deallocation , может быть значением нулевого указателя; если это так, и если функция освобождения включена в стандартную библиотеку, вызов не действует.

Если аргумент, присвоенный функции освобождения в стандартной библиотеке, является указателем, который не является нулевым значение указателя (4.11), функция освобождения освобождает хранилище, на которое ссылается указатель, заканчивая продолжительность области хранения.

Требуется, чтобы функция освобождения не имела эффекта при условии значения нулевого указателя. Это в основном то же самое, что и требование о том, чтобы функция освобождения игнорировала значения нулевого пионтера.