【发布时间】:2019-08-19 21:38:00
【问题描述】:
制作一个非常简单的链表我发现自己对什么可能是一个非常简单的范围概念感到困惑。第一个按预期工作。似乎在第二个 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;
}
【问题讨论】:
-
打开您的 C++ 书籍中解释按值传递函数参数与通过引用传递函数参数之间的区别的章节,然后阅读它。您按值传递它,
makeNode2泄漏内存。传递给 is 的指针未初始化,它在调用者中保持未初始化,因为它是按值传递的。这就是 C++ 的工作原理。 -
makeNode2有泄漏,你应该添加if(mountPt) delete mountPt;这一行,确保先删除之前的分配,然后再分配n。 -
Vuwox 是正确的。
-
@Amadeus 是的,我明白上面的编译,但是没有删除,这个函数会造成内存泄漏。并且通过添加它,编译器不会给出
parameter 'mountPt' set but not used将使用完整的警告级别,并且运行时错误也不会附加。
标签: c++ scope pass-by-reference pass-by-value