Почему в операторе delete не выполнена операция обнуливания указателя?

241
04 апреля 2018, 10:51

Допустим у меня есть понятие:

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; и указатель нужно было передать в функцию не по значению. Но после ответа не корректно... (ошибка невнимательности)

Answer 1

То, что вы обнуляете - никакого эффекта вне вашей функции transform не имеет. Ваше P = 0 скорее всего компилятор просто выбросит. Потому что вы работаете с копией, локальной для данной функции.

Оператор delete получает не ссылку, а значение указателя. Так что вы можете работать с выражениями-указателями, а не только с переменными. А вот если бы он обнулял - то вы были бы обязаны передавать только переменную.

И, кстати, сильно бы это спасало в ситуации, например,

Type * p = new Type;
Type * s = p;
delete p;
if (s) s->doIt();

?

READ ALSO
SimpleTable - шаблонный класс для создания таблиц в консоли

SimpleTable - шаблонный класс для создания таблиц в консоли

Я тут сделал небольшой проект на С++, и хотел поделиться с вами, вдруг вам понадобится создавать таблицу в консоли

250
Установка OGRE 3D

Установка OGRE 3D

Добрый деньПомогите установить графический движок OGRE под Visual Studio 2017 или (в идеале) под CLion 2017

249
Выделение предложения с обеих сторон в файле

Выделение предложения с обеих сторон в файле

Есть файлВ нём нужно посчитать количество повествовательных предложений и выделить 3 повествовательное предложение с обеих сторон

254
Quick Sort с использованием boost coroutine

Quick Sort с использованием boost coroutine

Есть задание написать алгоритм быстрой сортировки с использованием сопрограмм из библиотеки boostВроде написал, но получается, что он по времени...

241