制作一个非常简单的链接列表时,我发现自己对可能非常简单的范围概念感到困惑。第一个按预期工作。看起来在第二个 makeNode 函数中,节点“n”在终止时超出了范围。我很困惑为什么会发生这种情况。
我很确定分配的内存仍然存在,并且两种方法都有一个指向该内存的指针。那么为什么一个不工作呢?
该程序有两个make节点函数
#include <iostream>
using namespace std;
struct Node
{
int value;
Node* next;
Node() : next(NULL){}
};
Node* makeNode1(int value)
{
Node* n = new Node;
n->value = value;
return n;
}
void makeNode2(int value, Node* mountPt)
{
Node* n = new Node;
n->value = value;
mountPt = n;
}
void destroyNode(Node* mountPt)
{
if(mountPt->next != NULL)
{
destroyNode(mountPt->next);
delete mountPt;
}
}
int main() {
Node* origin = NULL;
// This works
origin = makeNode1(4);
// causes a runtime error when dereferenced
makeNode2(4, origin);
return 0;
}
最佳答案
对于makeNode2
,指针参数mountPt
本身是按值传递的,然后在函数内对指针本身进行任何修改,例如mountPt = n;
与原始参数 origin
无关。
您可以将其更改为按引用传递,即
void makeNode2(int value, Node*& mountPt)
关于c++ - 为什么对象在作为指针传递时超出范围,但在返回时却不会超出范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55409073/