Хорошо. Я плачу вокруг с простым кодом связанного списка.
Я держу главный узел как общедоступный. затем я объявляю указатель (head2) для хранения головного узла первого списка (first) в основной программе. Я объявляю второй список с именем second, и назначаю head2 в качестве узла head второго списка. Затем я удаляю head2. Я тогда получаю доступ к членам «second» (чей головной узел удален) и распечатываю их. Я ожидал ошибки сегментации.
Но это работает, только печатая 0 для данных головного узла. Что меня озадачивает, так это то, что если головной узел удален, как следующий указатель главного узла все еще находится в памяти? (это доступно через print, чтобы пройти через список. Я использую g ++ 4.6.1 в Ubuntu. Вот код:
#include<iostream>
struct Node
{
int data;
Node* next;
};
class list1
{
public:
list1();
Node* head;
void insert(int);
void print();
};
list1::list1()
{
head=NULL;
}
void list1::insert(int a)
{
Node* newnode=new Node;
newnode->data=a;
newnode->next=head;
head=newnode;
}
void list1::print()
{
Node* dummy=head;
while(dummy)
{
std::cout<<dummy->data<<std::endl;
dummy=dummy->next;
}
}
int main()
{
list1 first;
first.insert(1);
first.insert(2);
first.insert(4);
first.insert(9);
list1 second;
Node* head2=new Node;
head2=first.head;
second.head=head2;
delete head2;
second.print();
return 0;
}
Ваш код вызывает неопределенное поведение, получая доступ к объектам, время жизни которых истекло.
Там нет ничего странного, что это все еще может работать.
Неопределенное поведение означает, что может произойти все, включая то, что вы наблюдаете.
Удаление памяти означает просто возврат памяти в систему, и возвращенная память готова к повторному выделению. Но данные в памяти все еще там, пока память не будет перезаписана. Поскольку ваша программа удалила память, а ваша программа не знает, когда и кто снова выделит блок памяти. Таким образом, для вашей программы все еще использование памяти вызывает неопределенное поведение.