Удалить висячий указатель в C ++

0

После этого кода _var2 является Dangling pointer.

int* _var = new int(102);
auto _var2 = _var;
delete _var;

Должен ли я удалить _var2 (delete _var2)? Это неизбежно?

  • 1
    _var2 указывает на адрес несуществующего объекта. Если кто-то может отменить ссылку на него, вы должны указать, что он указывает на действительный объект или nullptr .
  • 1
    _var2 и _var являются неопределенными, как только вы удалите либо . Только удалить один . (или еще лучше, используйте умные указатели )
Показать ещё 1 комментарий
Теги:
pointers
dangling-pointer

3 ответа

4
Лучший ответ

Нет, потому что он уже удален.

delete ключевых слов на самом деле не удалить указатель, он удаляет значение, которое он указывает. В этом случае вы выделяете целое число 102 в куче в строке 1, а затем вы удаляете это целое число в строке 3. Оба ваших указателя (_var и _var2) по-прежнему содержат адрес, где было целое число, но его больше нет. delete _var2 будет неправильным, потому что на этом адресе ничего не выделяется.

  • 0
    Я подозреваю, что OP может думать, что ключевое слово delete C ++ работает аналогично оператору delete JavaScript.
  • 2
    Интересно, как бы проще было бы жить миллионам начинающих C ++, если бы ключевое слово было названо что-то вроде delete_at ... :)
Показать ещё 2 комментария
1

Я рекомендую вам использовать "std :: tr1 :: shared_ptr" для управления ресурсами.
в "эффективном c++" Скотта Мейерса в главе 3 есть полезная информация об этом.

0

UPD. В общем случае вам не нужно это делать, потому что точки будут удалены. Если вам нужно работать с указателями, лучше установить указатель на NULL после его удаления:

int* _var = new int(102);
auto _var2 = _var;
...
if(!!_var)
{
delete _var;
_var = NULL;
}
  • 1
    Как сказал @Wyzard, вы вызываете delete по указателю, который указывает на некоторую память, которую нельзя deleted . Кроме того, нет необходимости для !! сравнения.
  • 2
    чтобы избежать подобных проблем лучше использовать std::shared_ptr
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню