Что вам нужно сделать, это обнулить все указатели на объект, который вы только что удалили. Идея указателей состоит в том, что будет несколько указателей, хранящих адрес одного и того же объекта. Если нет, то есть небольшая причина использовать пустой указатель, поэтому шаблон, который вы пытаетесь захватить, не очень полезен - но вы далеко не первый, кто попробует это сделать. Как уже упоминалось в других ответах, единственный способ справиться с указателями - тщательно контролировать доступ к ним.
Название вашего вопроса абсолютно правильно! Для этого есть веская причина. Указатель идентифицирует местоположение, в котором хранится объект определенного типа. Указатель на указатель дает вам возможность изменить объект, на который указывает указатель.
void Foo(Parent **pp)
{
*pp = new OtherChild();
}
Ваш Child
класс является производным от Parent
, как и мой OtherChild
класс. Предположим, что компилятор позволил вам сделать это:
Child *c = 0;
Foo(&c);
Вы ожидали, что это сработает, но если бы это было так, то теперь у нас был бы Child
указатель c
, который фактически указывает на экземпляр OtherChild
. Кто сказал, что эти два типа совместимы?
Опять же, это очень частое недоразумение - оно часто встречается здесь для других языков, особенно в отношении List<Parent>
и List<Child>
в C #.