将节点添加到链表中而不显式分配内存空间(不使用new)

时间:2019-05-12 16:26:43

标签: c++ c++11 memory linked-list

因此,我正在学习如何制作链接列表,并且想知道为什么添加节点时需要使用“ 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 ++怪异吗?

谢谢!

3 个答案:

答案 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构造似乎就没有任何合法目的。