Ответ 1
Язык в следующем стандарте С++ 0x (раздел 5.3.5 [expr.delete]
) выглядит следующим образом:
Если значение операнда выражение delete не является нулевым значение указателя, выражение-выражение вызовет функцию освобождения (3.7.4.2). В противном случае не указано, будет ли освобождение функция будет вызвана. [ Обратите внимание функция освобождения называется независимо от того, является ли деструктор для объекта или какого-либо элемента array генерирует исключение. - конечная нота]
Таким образом, это неопределенное поведение, некоторые компиляторы могут вызывать operator delete
, когда указатель NULL удаляется, а другие - нет.
EDIT: термин функция освобождения, используемая стандартом, как представляется, вызывает некоторую путаницу. Он поставляется со ссылкой. Некоторые ключевые слова из 3.7.4.2 [basic.stc.dynamic.deallocation]
, которые могут помочь уточнить:
Если класс
T
имеет функцию освобождения члена с именемoperator delete
с точно одним параметром, то эта функция является обычной функцией (без размещения) освобождения.
В стандарте также очень ясно, что пользовательский operator delete
должен принимать параметр, который является значением нулевого указателя:
Значение первый аргумент, предоставленный функции освобождения, может быть значением нулевого указателя; если да, и если освобождение функция включена в стандартную библиотеку, вызов не имеет эффекта.
Но из-за неуказанного поведения 5.3.5 вы не должны полагаться на вызов operator delete
, когда указатель имеет значение null.