2012-09-13 135 views
0
class LinkTest{ 
public: 

    LinkTest(){ 
    } 
    void start(){ 
     List list; 
     Node * n ; 
     for(int i = 0; i < 5; i++){ 

     //using pointer 
      // n = new Node(i); 
      // list.add(n); 

     //not using pointer 
      Node n(i); 
      list.add(&n); 
     } 
     list.displayAll(); 
    } 
}; 

    class List{ 
public: 
    Node * first, *last; 

    List(){ 
     first = last = NULL; 
    } 

    void add(Node *n){ 
     if(first == NULL){ 
      first = last = n; 
     }else{ 
      last->next = n; 
      n->prev = last; 
      last = n; 
     } 
    } 

    void displayAll(){ 
     while(first != NULL){ 
      first->display(); 
      first =first->next; 
     } 
    } 
}; 

我有一些Java的经验,但我是新来的C++。这里我做一个链表测试。声明对象

如果我使用指针,我会得到正确的输出(0到4)。但是,如果我不使用指针并且像使用本地声明一样使用,那么输出就像是无限的4。有人可以向我解释这个吗?

如果我是正确的,本地声明“Node n(i)”会将n放入堆栈,那么这是否意味着在下一个循环中n将被替换为新的n(i + 1)?或只是n(i + 1)将被添加到堆栈?为什么输出是一堆4的?

回答

1

目的你在这里

Node n(i); 

声明是自动存储的局部对象,所以是的,它存在在堆栈上,并且更具体地,本地堆栈帧之内。只要本地范围结束,它就会停止存在,这是for循环的结束。

但是,您将该对象的地址放入超出当前范围的列表中。该地址将继续指向堆栈中的某个位置,但未定义存储在那里的地址。

所以你看到的是undefined unbehaviour。

0

n在循环的每次迭代时超出范围,因此您将最终无效对象的地址传递给您的列表。一旦循环完成并且您尝试打印结果,则会遇到尝试访问这些(现在无效)对象的未定义行为。