Чтобы помочь вам вспомнить ответ на этот вопрос, подумайте:
T* p = ...;
delete p;
Что происходит с p
после delete
и до того, как оно само покинет область действия, или объект, для которого данные его члена уничтожены?Там нет однозначного ответа.Таким образом, если C ++ предпринял дополнительное действие, чтобы установить p
в NULL
, то, по крайней мере, некоторое время было потрачено впустую - установка переменной, которая была отброшена сразу после этого.В C ++ руководящим принципом является то, что не требуются затраты времени на выполнение функций, которые вам могут не понадобиться или не понадобиться.
Далее рассмотрим:
T* p = ...
T* p1 = p;
delete p;
Внезапно возникнет идея p
значение NULL
, которое, возможно, облегчало проверку указателей на достоверность, падает.Для компилятора просто не практично знать каждый другой указатель, который все еще может ссылаться на только что удаленный объект, и стоимость отслеживания этой информации во время выполнения и обнуления всех указателей нецелесообразна.
Итак,чтобы быть действительно явным, если в ...
T* p = ...;
delete p;
... p
было установлено значение 0x12345678, то после delete
p
все равно будет 0x12345678.delete
никогда не меняет свой аргумент.Любая попытка получить доступ к памяти по этому адресу приведет к неопределенному поведению (если, конечно, тот же адрес не будет возвращен последующим запросом выделения кучи).
Отдельно, если вы установите указатель на NULL
Вы сами можете снова позвонить по номеру delete
, так что нет никакого смысла делать это:
if (p != NULL) delete p;