简单链表代码的奇怪结果

时间:2013-03-27 03:03:59

标签: c++ data-structures singly-linked-list

好。我正在使用简单的链表代码付款。

我将头节点保持公开状态。然后我声明一个指针(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;
}

2 个答案:

答案 0 :(得分:2)

您的代码通过访问生命周期结束的对象来调用未定义的行为。

它可能仍然有效,这并不奇怪。

未定义的行为意味着可能发生任何事情,包括您正在观察的内容。

答案 1 :(得分:1)

删除内存只是意味着将内存返回给系统,并且已准备好再次分配返回的内存。但是内存中的数据仍然存在,直到内存被覆盖。由于您的程序已删除内存,并且您的程序不知道何时以及谁将再次分配内存块。因此,对于您的程序,仍然使用内存会导致未定义的行为。