Будет ли удаление объекта устанавливать его ссылки равными NULL? - PullRequest
1 голос
/ 27 мая 2011

У меня есть массив указателей на указатели, и когда я сделаю array [index]=classpointer; и вызову delete classpointer;, значение, хранящееся в array[index], станет NULL?

Ответы [ 4 ]

6 голосов
/ 27 мая 2011

Нет.Он по-прежнему указывает на то место, которое classpointer ранее указывало, или, другими словами, он болтается.

4 голосов
/ 27 мая 2011

Нет. Индекс массива всегда целочисленный (если вы не выполняете какую-то безумную перегрузку операторов). Целые числа являются примитивными типами данных, и примитиву не имеет смысла быть NULL.

Вы имели в виду "Будет ли массив [индекс] станет NULL?" Смотри ответ @ Mahesh.

2 голосов
/ 27 мая 2011

Чтобы помочь вам вспомнить ответ на этот вопрос, подумайте:

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;
0 голосов
/ 30 мая 2011

Только если это std::weak_ptr.Обычные указатели останутся без изменений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...