Заметил особенность, которую раньше не замечал.
class A {};
int main() {
A *a;
a = new A;
delete a;
if (!a) {
// Вот сюда при вышеуказанных условия не попадём
}
a = NULL;
if (!a) {
// а теперь попадём
}
} |
Т.е. обычное логическое сравнение не проходит, если указателю явно не присвоено NULL. Проверил и в MSVS и в gcc.
А почему так?
Мне почему то всегда казалось, что если по ссылке нет объекта, то if (!a) должно меня пускать в условие.
13.04.11 18:22: Перенесено из 'C/C++'
Dmitry
А что не так? О каких логических сравнениях идет речь в C++? Ты создал объект, и положил его адрес в указатель a. Потом удалил объект, но переменная не обнулилась. При проверке if (!a) значение указателя a > 0 (там по прежнему адрес уже удаленного объекта, он не равен нулю), следовательно логическая операция ! вернет 0 и условие не выполнится. Присвоил указателю NULL - инверсия вернет 1 (true) и условие выполнится