声明对象

时间:2012-09-13 02:58:07

标签: c++ linked-list

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?

2 个答案:

答案 0 :(得分:1)

您在此声明的对象

Node n(i);

是自动存储的本地对象,所以是的,它存在于堆栈中,更具体地说,存在于本地堆栈帧中。一旦局部范围结束,它就会停止存在,这就是for循环的结束。

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

所以你看到的是未定义的行为。

答案 1 :(得分:0)

每次循环迭代时,

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