Удалить висячий указатель в переполнении стека

После этого кода _var2 Dangling pointer,

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

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

0

Решение

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

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

4

Другие решения

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

1

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

int* _var = new int(102);
auto _var2 = _var;
...
if(!!_var)
{
delete _var;
_var = NULL;
}
0
По вопросам рекламы [email protected]