返回成员变量时,为什么在函数内外得到不同的结果?
When returning a member variable, why do I get different results inside and outside a function?
当我尝试打印函数内的成员变量时,它给出了我想要的结果。但是,如果我 return 这个成员变量然后尝试在 main 中访问它,它会给我一个不同的结果。为什么会这样?
我的代码如下所示:
Node.h:
#include <cstddef>
#include <vector>
#include <iostream>
using namespace std;
class Node{
public:
int v;
Node * parent;
Node(int I);
Node(int I,Node * p);
vector<Node*> myfun();
}
Node.cpp:
Node::Node(int I){
v = I;
parent = NULL;
}
Node::Node(int I,Node * p){
v = I;
parent = p;
}
vector<Node*> Node::myfun(){
vector<Node*> myvec;
Node next1(1,this);
myvec.push_back(&next1);
Node next2(2,this);
myvec.push_back(&next2);
cout << myvec[0]->v << endl; // prints out "1"
cout << myvec[1]->v << endl; // prints out "2"
return(myvec);
}
main.cpp:
#include "Node.h"
int main(){
vector<Node*> myvec;
Node init(0);
myvec = init.myfun();
cout << myvec[0]->v << endl; // prints out garbage
cout << myvec[1]->v << endl; // prints out garbage
return 0;
}
因为在您的 Node::myfun()
中,您的 next1
和 next2
变量在方法结束时都被销毁(它们不再存在)。因此,您将返回指向不再存在的对象的指针。这样的指针被称为悬挂指针,取消引用悬挂指针是未定义的行为。
当我尝试打印函数内的成员变量时,它给出了我想要的结果。但是,如果我 return 这个成员变量然后尝试在 main 中访问它,它会给我一个不同的结果。为什么会这样?
我的代码如下所示:
Node.h:
#include <cstddef>
#include <vector>
#include <iostream>
using namespace std;
class Node{
public:
int v;
Node * parent;
Node(int I);
Node(int I,Node * p);
vector<Node*> myfun();
}
Node.cpp:
Node::Node(int I){
v = I;
parent = NULL;
}
Node::Node(int I,Node * p){
v = I;
parent = p;
}
vector<Node*> Node::myfun(){
vector<Node*> myvec;
Node next1(1,this);
myvec.push_back(&next1);
Node next2(2,this);
myvec.push_back(&next2);
cout << myvec[0]->v << endl; // prints out "1"
cout << myvec[1]->v << endl; // prints out "2"
return(myvec);
}
main.cpp:
#include "Node.h"
int main(){
vector<Node*> myvec;
Node init(0);
myvec = init.myfun();
cout << myvec[0]->v << endl; // prints out garbage
cout << myvec[1]->v << endl; // prints out garbage
return 0;
}
因为在您的 Node::myfun()
中,您的 next1
和 next2
变量在方法结束时都被销毁(它们不再存在)。因此,您将返回指向不再存在的对象的指针。这样的指针被称为悬挂指针,取消引用悬挂指针是未定义的行为。