После этого кода _var2 является Dangling pointer
.
int* _var = new int(102);
auto _var2 = _var;
delete _var;
Должен ли я удалить _var2 (delete _var2
)? Это неизбежно?
Нет, потому что он уже удален.
delete
ключевых слов на самом деле не удалить указатель, он удаляет значение, которое он указывает. В этом случае вы выделяете целое число 102 в куче в строке 1, а затем вы удаляете это целое число в строке 3. Оба ваших указателя (_var
и _var2
) по-прежнему содержат адрес, где было целое число, но его больше нет. delete _var2
будет неправильным, потому что на этом адресе ничего не выделяется.
delete
C ++ работает аналогично оператору delete
JavaScript.
delete_at
... :)
Я рекомендую вам использовать "std :: tr1 :: shared_ptr" для управления ресурсами.
в "эффективном c++" Скотта Мейерса в главе 3 есть полезная информация об этом.
UPD. В общем случае вам не нужно это делать, потому что точки будут удалены. Если вам нужно работать с указателями, лучше установить указатель на NULL после его удаления:
int* _var = new int(102);
auto _var2 = _var;
...
if(!!_var)
{
delete _var;
_var = NULL;
}
delete
по указателю, который указывает на некоторую память, которую нельзя deleted
. Кроме того, нет необходимости для !!
сравнения.
std::shared_ptr
_var2
указывает на адрес несуществующего объекта. Если кто-то может отменить ссылку на него, вы должны указать, что он указывает на действительный объект илиnullptr
._var2
и_var
являются неопределенными, как только вы удалите либо . Только удалить один . (или еще лучше, используйте умные указатели )