Когда вы используете
int* temp = a;
и a
и temp
указывают на одну и ту же память, которая была выделена в строке
int* a = new int;
Когда вы используете
delete(a);
эта память была освобождена. В то время и temp
, и a
являются висящими указателями.
Используя
a = b;
b = temp;
вы изменили a
, чтобы указать на действительную память, но теперь и b
, и temp
- это висячие указатели.
Использование temp
в
cout << *temp << endl;
delete (temp); // error
не правильно. Оба они являются причиной неопределенного поведения. С неопределенным поведением бессмысленно пытаться понять, что происходит - все может случиться.
Но если я не delete(a)
, это работает.
Это имеет смысл. Без этого вызова все указатели остаются действительными до конца функции.
Вы должны добавить код, чтобы удалить оба указателя до конца функции. Но тогда вы должны отслеживать, какие указатели действительны для использования в вызовах на delete
.
Вы можете распечатать их значения, чтобы понять это.
std::cout << "a: " << (void*)a << std::endl;
std::cout << "b: " << (void*)b << std::endl;
std::cout << "temp: " << (void*)temp << std::endl;