Разыменование нулевого указателя является неопределенным поведением.
Фактически, стандарт называет именно эту ситуацию в примечании (8.3.2 / 4 «Ссылки»):
Примечание: в частности, пустая ссылка не может существовать в четко определенной программе, потому что единственный { {1}} способ создать такую ссылку - привязать ее к «объекту», полученному разыменованием нулевого указателя, что вызывает неопределенное поведение.
Кстати: однажды я знаю, что указатель NULL может быть "разыменован" четко определенным способом, это как операнд для оператора sizeof
, потому что операнд для sizeof
на самом деле не вычисляется (поэтому разыменование никогда не происходит).
int& ref = *ptr;
Приведенное выше утверждение на самом деле ничего не разыменовывает. Так что проблем нет, пока вы не используете ref
(который недействителен).
Разыменование указателя NULL является неопределенным поведением. Перед разыменованием значения следует проверить, является ли оно NULL.
Для полноты это: http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#232 говорит конкретно об этой проблеме.
Разыменование указателя NULL является явно неопределенным поведением в стандарте C++, поэтому то, что вы видите, зависит от реализации.
Копирую из 1.9.4 в проекте стандарта C++0x (в этом отношении он похож на предыдущие стандарты):
Некоторые другие операции описаны в настоящем международном стандарте как неопределенными (например, эффект разыменования нулевого указателя). [Примечание]: настоящий международный стандарт не накладывает никаких требований на поведению программ, которые содержат неопределенное поведение. - end note]