c++ - 声明对象

标签 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。有人可以给我解释一下吗?

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

最佳答案

你在这里声明的对象

Node n(i);

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

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

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

关于c++ - 声明对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12398824/

相关文章:

c++ - 无法从 'const std::string [3]' 转换为 'std::string'

c - 从函数返回链表的头

c - 在最坏的情况下,在排序的链表中搜索一个元素需要进行多少次比较?

无法将节点附加到 C 中链表的末尾

java - 在java中创建一个以类名作为数据类型的变量

java - 为什么在插入 LinkedList 和 ArrayList 时得到关于时间的不同输出

c++ - 没有合适的从 std::string 到 int 的转换

c++ - 无法调用 future::get 存储在 map 中的 future

c++ - 从 CLion 中的构建中排除

c++ - std::function 的模板参数是如何工作的? (执行)