Странный результат на простом коде связанного списка

Хорошо. Я плачу вокруг с простым кодом связанного списка.

Я держу главный узел как общедоступный. затем я объявляю указатель (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;
}

-2

Решение

Ваш код вызывает неопределенное поведение, получая доступ к объектам, время жизни которых истекло.

Там нет ничего странного, что это все еще может работать.

Неопределенное поведение означает, что может произойти все, включая то, что вы наблюдаете.

2

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

Удаление памяти означает просто возврат памяти в систему, и возвращенная память готова к повторному выделению. Но данные в памяти все еще там, пока память не будет перезаписана. Поскольку ваша программа удалила память, а ваша программа не знает, когда и кто снова выделит блок памяти. Таким образом, для вашей программы все еще использование памяти вызывает неопределенное поведение.

1

По вопросам рекламы [email protected]