2013-03-27 58 views
-2

好吧。我用一个简单的链接列表代码付款。简单链接列表代码上的奇怪结果

我把头节点保持公开。然后我声明一个指针(head2)来存储第一个列表的头节点(第一个)到主程序中。我声明第二个名为second的列表,并将head2指定为第二个列表的头节点。然后我删除head2。然后我访问“第二个”(其头节点被删除)的成员并打印出来。我预料会出现分段错误。 但它的工作原理是,只为头节点的数据打印0。令我费解的是,如果头节点被删除,头节点的下一个指针如何仍然在内存中? (这是由印刷通过list.I遍历访问正在使用克++ 4.6.1在Ubuntu.Here是代码:

#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

你会做得很好谷歌**“C++未定义的行为”** – WhozCraig 2013-03-27 03:08:39

回答

2

您的代码通过访问对象,它们的寿命结束调用未定义的行为

没有什么奇怪的是,它仍然可以正常工作。

未定义行为意味着什么事情都可能发生,包括您看到的是什么。

1

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

+0

非常感谢。这很清楚。 – xkcd83 2013-03-27 13:48:23

+0

@ xkcd83如果我回答了您的问题,请点击正确的标志接受我的回答。这会增加我的声誉。 – TieDad 2013-03-27 14:12:18