通过引用向量传递给出错误的结果

时间:2015-04-08 03:56:33

标签: c++ vector pass-by-reference

所以我想通过调用构造函数创建一个Node列表,并将Node的地址推送到一个向量(已经通过引用传递)。我从下面的代码中得到了错误的结果。

#include <iostream>
#include <vector>

using namespace std;

class Node{
    public:
        //Constructor
        Node(int id, vector<Node*> & listNode){
            this->id = id;
            listNode.push_back(this);
        }
        int id;
};

int main(){
    vector<Node*> listNode;

    for(int i=0; i<5; i++){
        Node A(i, listNode);
    }

    for(int i=0; i<5; i++){
        cout<<listNode[i]->id;
    }
}

我期待的输出是:01234
但我得到了44444 有没有想过这个错误?

2 个答案:

答案 0 :(得分:2)

for(int i=0; i<5; i++){
    Node A(i, listNode);
}

A的范围限定为for循环,当for完成后,A被破坏。 listNode包含一系列悬空指针。

您的代码只有undefined behavior

增强代码:

class Node{
    public:
        //Constructor
        Node(int id){
            this->id = id;
        }
        int id;
};

vector<Node> listNode;

for(int i=0; i<5; i++){
    listNode.push_back(A(i));
}

答案 1 :(得分:1)

生命周期是问题的原因。

在for循环结束后,您的对象A已被销毁。 (例如,当我来到1时,在i = 0时创建的obj A将被删除) 但是,向量不知道指针是否不可用。所以指针有一个值,指向一个永远不会是A的记忆的记忆。