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

Требуется ли игнорировать определенные пользователем и специфичные для класса операторы удаления nullptr как что делают операторы из стандартной библиотеки?


параллельное обсуждение в гугл группах.

2 ответа

От [expr.delete],

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

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

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

Из [basic.stc.dynamic]:

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

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

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

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

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

Другие вопросы по тегам