C++ C++;基本动态分配

C++ C++;基本动态分配,c++,dynamic,C++,Dynamic,在这个例子中,我不理解为什么列表的第一个元素不能被动态分配。 我知道解决方案不好,因为我将丢失指向“a”的指针,它将悬空。我不明白的是,为什么在这种情况下,我的函数返回一个空列表 我已根据要求简化了示例: ListNode* createList() { //Why not - ListNode* a = new ListNode(0); ? ListNode list(0); ListNode * a = &list; for(int i=0; i < 5

在这个例子中,我不理解为什么列表的第一个元素不能被动态分配。 我知道解决方案不好,因为我将丢失指向“a”的指针,它将悬空。我不明白的是,为什么在这种情况下,我的函数返回一个空列表

我已根据要求简化了示例:

ListNode* createList() {
    //Why not - ListNode* a = new ListNode(0); ?
    ListNode list(0); ListNode * a = &list;
    for(int i=0; i < 5; i++){
        a->next = new ListNode(0);
        a = a->next;
    }
    //return a->next;
    return list.next;
}
ListNode*createList(){
//为什么不-ListNode*a=新的ListNode(0)?
ListNode列表(0);ListNode*a=&list;
对于(int i=0;i<5;i++){
a->next=新建列表节点(0);
a=a->next;
}
//返回a->next;
返回列表。下一步;
}

我修改了您的代码,以便动态分配第一个元素

您建议的解决方案的问题是,当a到达列表的末尾时,它将返回指向列表末尾(从而返回空列表)的指针

ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
if (l1 == NULL && l2 == NULL) return NULL;
int carry = 0, sum = 0;
ListNode* a = new ListNode(0);
ListNode* head = a;
while(l1 || l2 || carry){
    sum = carry;
    if (l1 != NULL) sum+=l1->val;
    if (l2 != NULL) sum+=l2->val;     
    carry = sum/10;
    a->next = new ListNode(sum % 10);
    a = a->next;
    l1 = (l1 == NULL) ? NULL : l1->next;
    l2 = (l2 == NULL) ? NULL : l2->next;
}
return head->next;
}


希望有帮助。

返回
a->next
失败是因为

a = a->next;
在创建列表时对其进行迭代,因此
a
始终指向列表中的最后一个节点。当您完成构建列表并

return a->next;
a
仍然是列表中的最后一个节点,
next
可能是
NULL
nullptr
。如果不是,你就有一个大的夸夸其谈的错误。没有返回列表,因为没有更多的列表要返回,此时您已经丢失了列表的开头。哎呀

另一方面,

return list.next; 
返回您创建的虚拟占位符节点之后的节点,这是您在虚拟节点上构建的列表。由于
list
是一个局部变量,因此它具有自动存储持续时间,并在超出范围时为您清除。它所指向的
ListNode
s链都是动态分配的,可以安全返回

增编:

在您删除的代码中,使用

ListNode* a = new ListNode(0);
这意味着在函数的末尾,有一个
a
需要清理,正如您所指出的,虽然这不是一个悬空指针,但它被称为泄漏

你可以用它来挽救它

ListNode* a = new ListNode(0);
ListNode* start = a;
后来

return start->next;
但是使用
列表创建的自动版本不需要清理,是更好的选择,因为出错的可能性更小


更好的做法是根本不使用虚拟节点,只保留指向第一个创建的节点的指针,但这是下一次的故事。

如果您有未定义的行为,任何事情都可能发生。请详细说明您的问题好吗?你说的“空名单”是什么意思?您是否尝试过在调试器中逐行遍历代码以查看发生了什么?另外,请尝试创建并向我们展示。您能否提供一个可编译的代码,以便我们能够更好地理解问题并在我们的机器上运行它?您展示的代码应该没有任何问题,就像您展示的一样(注释已就位)。没有悬空的指针或漏洞。它应该返回五个节点的列表。您计划如何处理
ListNode*a=newlistnode(0)的泄漏?我同意存在漏洞,这很糟糕,但我只是想让解决方案通过动态分配运行