"new"构造链表节点时如何删除链表?

How to delete the list when linked list nodes are constructed with "new"?

问题:

给你两个链表,代表两个非负数。这些数字以相反的顺序存储,并且它们的每个节点都包含一个数字。将这两个数字相加并 return 将其作为链表。 输入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 输出:7 -> 0 -> 8

解决方案:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */

ListNode *addTwoNumbers(ListNode *l1, ListNode *l2) { 
    ListNode dummy(-1); 
    int carry = 0;
    ListNode *prev = &dummy;
    for (ListNode *pa = l1, *pb = l2;
        pa != nullptr || pb != nullptr;
        pa = pa == nullptr ? nullptr : pa->next,
        pb = pb == nullptr ? nullptr : pb->next,
        prev = prev->next) {
        const int ai = pa == nullptr ? 0 : pa->val;
        const int bi = pb == nullptr ? 0 : pb->val;
        const int value = (ai + bi + carry) % 10;
        carry = (ai + bi + carry) / 10;
            prev->next = new ListNode(value); 
        if (carry > 0)
            prev->next = new ListNode(carry);
        return dummy.next;
  }

解决方案很简单,但我想知道因为所有节点都是用"new"构造的,所以在主函数使用这个函数并终止程序后会发生什么。 "new" 分配的内存还会在那里吧?这是内存泄漏吗?无论如何要避免这种情况?

您可以使用 delete 释放使用 new 分配的内存。

所以基本上在你完成你的链接列表之后,你可以迭代它并通过将指向下一个的指针作为临时变量来删除所有节点。

while(list){
    temp = list->next;
    delete list;
    list = temp;
}

是的,如果您在使用完存储在内存中的数据后不删除为 任何 程序分配的内存,那么从技术上讲就是内存泄漏。一旦您的程序退出,内存将被清除。