所以我想通过调用构造函数创建一个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
有没有想过这个错误?
答案 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的记忆的记忆。