Допустим у меня есть понятие:
class Predator;
class Animal{ public: Predator* confirmation; ...}
// тут производные классы, представляющие разные животные
//теперь преобразование хищникa
void transform(Animal* P) {
if(P) delete P->confirmation; // удалили обьект, но это еще хищник
P = 0; // уже не хищник
}
Вопрос: если обнуливание указателья сразу реализовалось бы в операторе delete, то какого рода программы пострадали бы от этого?
P.S. я хотел обнулять P->confirmation , а не P = 0; и указатель нужно было передать в функцию не по значению. Но после ответа не корректно... (ошибка невнимательности)
То, что вы обнуляете - никакого эффекта вне вашей функции transform не имеет. Ваше P = 0 скорее всего компилятор просто выбросит. Потому что вы работаете с копией, локальной для данной функции.
Оператор delete получает не ссылку, а значение указателя. Так что вы можете работать с выражениями-указателями, а не только с переменными. А вот если бы он обнулял - то вы были бы обязаны передавать только переменную.
И, кстати, сильно бы это спасало в ситуации, например,
Type * p = new Type;
Type * s = p;
delete p;
if (s) s->doIt();
?
Сборка персонального компьютера от Artline: умный выбор для современных пользователей