好。我正在使用简单的链表代码付款。
我将头节点保持公开状态。然后我声明一个指针(head2)来存储主程序中第一个列表(第一个)的头节点。我声明了第二个名为second的列表,并将head2指定为第二个列表的头节点。然后我删除head2。然后我访问“second”(其头节点被删除)的成员并打印它们。我预计会出现分段错误。 但它可以工作,只为头节点的数据打印0。让我感到困惑的是,如果删除了头节点,那么头节点的下一个指针仍然在内存中? (这是通过print访问遍历列表。我在Ubuntu中使用g ++ 4.6.1。这是代码:
#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;
}
答案 0 :(得分:2)
您的代码通过访问生命周期结束的对象来调用未定义的行为。
它可能仍然有效,这并不奇怪。
未定义的行为意味着可能发生任何事情,包括您正在观察的内容。
答案 1 :(得分:1)
删除内存只是意味着将内存返回给系统,并且已准备好再次分配返回的内存。但是内存中的数据仍然存在,直到内存被覆盖。由于您的程序已删除内存,并且您的程序不知道何时以及谁将再次分配内存块。因此,对于您的程序,仍然使用内存会导致未定义的行为。