c++ - 为什么对象在作为指针传递时超出范围,但在返回时却不会超出范围

标签 c++ scope pass-by-reference pass-by-value

制作一个非常简单的链接列表时,我发现自己对可能非常简单的范围概念感到困惑。第一个按预期工作。看起来在第二个 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/

相关文章:

python - python函数调用后变量的意外变化

c++ - 写入套接字时使用 write() 而不是 send() 的性能影响

c++ - 使用 OpenCV 计算协方差矩阵

c++ - 在 C++11 中声明 char 十六进制常量

php - 如何访问声明为变量的函数内的变量?

在我的代码中混淆了 ref 调用和 value 调用

C++ 引用传递

c++ - 运营商重载奇怪的输出

java - 输入/输出流是否在销毁时关闭?

javascript - 如果 Javascript 中的 "with"语句创建了一个新的作用域,为什么这个闭包每次都不包含新作用域中的新的 "x"?