C++ 自动但非动态分配对象(链表节点)时出错

C++ 自动但非动态分配对象(链表节点)时出错,c++,memory-management,linked-list,C++,Memory Management,Linked List,我在玩链表节点的自动和动态内存分配。下面的代码表示最小的工作示例 以下代码可以工作并打印我期望的结果: list 1: 1 list 2: 2 list 3: 1 2 代码: l3似乎由一些随机值组成: list 1: 1 list 2: 2 list 3: -1845946528 -272632592 -2092384207 (lldb) 我试着调试merge\u two\u list\u iter函数,l3看起来是正确的。但是,print_list函数打印一些随机值。如果有人能

我在玩链表节点的自动和动态内存分配。下面的代码表示最小的工作示例

以下代码可以工作并打印我期望的结果:

list 1:
1 
list 2:
2 
list 3:
1 2 
代码:

l3似乎由一些随机值组成:

list 1:
1 
list 2:
2 
list 3:
-1845946528 -272632592 -2092384207 (lldb)
我试着调试merge\u two\u list\u iter函数,l3看起来是正确的。但是,print_list函数打印一些随机值。如果有人能告诉我这里发生了什么,我将不胜感激

ListNode* merge_two_lists_iter(ListNode* l1, ListNode* l2) {

    ListNode* res = nullptr;
    ListNode test (l1->val);
    res = &test;
    res->next = new ListNode(l2->val);

    return res;
}

我假设这就是你替换那行时合并两个列表的样子。请注意,test是在堆栈上分配的局部变量。当函数返回res时,test将超出范围,因此该函数返回已释放堆栈内存的地址。然而,在释放内存后,内存的实际情况在C标准中没有定义。因此,在本例中,合并列表的地址中有随机垃圾。

这是否回答了您的问题?这里详细讨论了这个主题。它还回答了局部变量会发生什么的问题。我承认这不是一个直接的答案。我希望其他人能提出更好的副本。不过,我认为我在这两种情况下都返回了局部变量的内存,还是我错了?你的意思是当我使用res=newlistnodel1->val;,我只是偶然得到了正确的答案?现在知道了,test是一个局部变量。哦,我明白了,谢谢。那么,这是函数返回后需要变量中的数据时使用堆规则的一个示例吗?是的,这将是在堆上分配内存的一个原因。
list 1:
1 
list 2:
2 
list 3:
-1845946528 -272632592 -2092384207 (lldb)
ListNode* merge_two_lists_iter(ListNode* l1, ListNode* l2) {

    ListNode* res = nullptr;
    ListNode test (l1->val);
    res = &test;
    res->next = new ListNode(l2->val);

    return res;
}