因此,我正在学习如何制作链接列表,并且想知道为什么添加节点时需要使用“ new”。以下是正确添加节点的函数:
void addNode(int value){
Node* new_node_ptr = new Node;
new_node_ptr->value = value;
if (root == NULL){
root = new_node_ptr;
traveler = new_node_ptr;
} else {
traveler->next = new_node_ptr;
traveler = new_node_ptr;
}
}
但是,由于我是c ++的新手,所以当我尝试自己找出方法而不是一行代码时:
Node* new_node_ptr = new Node;
我写道:
Node new_node;
Node* new_node_ptr = &new_node;
这不起作用。似乎每次尝试添加新节点时,都会将new_node变量分配给相同的内存地址。这同时令人着迷和令人震惊。有人可以向我解释这种c ++怪异吗?
谢谢!
答案 0 :(得分:3)
写作时
Node new_node;
该变量是在堆栈上创建的,一旦addNode
退出,就不应使用该变量。一旦函数退出,addNode
将失去该内存的“所有权”,并且与new_node
关联的内存将被程序的其他部分再次使用。尝试使用它是未定义的行为,因此不能依赖。
您必须动态分配内存以确保数据寿命超出功能范围。
在第二种使用堆栈分配的情况下,如果new_node
始终被分配相同的内存,这就是在测试用例中如何解决的。取决于在addNode
之前调用的其他函数的顺序,这种情况可能不会总是发生,并且可能不会在“真实程序”中保持一致。
答案 1 :(得分:0)
在不使用 new 声明变量时,将保存堆栈中分配的一部分内存。存储在堆栈中的变量属于函数内部,而不属于函数外部(例如,计数器,迭代器等)。
使用 new 进行声明时,您会在 heap 中保存分配的一部分内存。可以在整个程序中(也可以通过某些方法,也可以通过其他程序)访问存储在堆中的变量。
您可以在以下链接中找到更多详细信息: https://www.gribblelab.org/CBootCamp/7_Memory_Stack_vs_Heap.html
答案 2 :(得分:0)
Node* new_node_ptr = new Node;
上面的意思是“创建一个新的节点对象并将其无限期保留”。
Node new_node;
Node* new_node_ptr = &new_node;
以上不是的意思是“创建一个新的节点对象并将其无限期保留”。
如果这两个版本都做了您希望它们做的事情,那么现在那个将会很奇怪,因为那样的话new
构造似乎就没有任何合法目的。