内存泄漏问题,销毁函数没有释放我的反向函数创建的链表节点

问题描述 投票:0回答:1

list_sum 函数中的 destroy_list(pHead1_reversed) 和 destroy_list(pHead2_reversed) 函数似乎没有释放节点。我遇到了内存泄漏。我做错了什么?

int main(int argc, char* argv[])
{
//add up 189 + 11

Node* head1 = NULL;
    Node* head2 = NULL;
    Node* head_sum = NULL;
    //create a list for the number 189
    head_insert(&head1, 9);
    head_insert(&head1, 8);
    head_insert(&head1, 1);
    //create a list for the number 11
    head_insert(&head2, 1);
    head_insert(&head2, 1);
    head_sum = list_sum(head1, head2);
    printf("The sum of ");
    print_list(head1);
    printf(" + ");
    print_list(head2);
    printf("\n");
    printf(" = ");
    print_list(head_sum);
    printf("\n");
    //clean up three lists
    destroy_list(head1); head1 = NULL;
    destroy_list(head2); head2 = NULL;
    destroy_list(head_sum); head_sum = NULL;
    return 0;
}
**********************************************************************
void head_insert(Node** hHead, int newItem)
{
    Node* pNode = NULL;
    pNode = (Node*)malloc(sizeof(Node));
    if (pNode == NULL)
    {
        printf("malloc failed for node \n");
        exit(1);
    }
    pNode->data = newItem;
    pNode->next = *hHead;
    *hHead = pNode;
}


void destroy_list(Node* hHead)
{
    Node* current = hHead;
    Node* next;

    while (current != NULL) {
        next = current->next;
        free(current);
        current = next;
    }
}

Node* list_sum(Node* hHead1, Node* hHead2)
{
    Node* pHead1_reversed=reverse(hHead1);
    Node* pHead2_reversed=reverse(hHead2);
    Node* result_reversed;
    Node* resultHead = NULL;
    int carry = 0;
    while (pHead1_reversed != NULL || pHead2_reversed != NULL || carry != 0) {
        int digit1 = (pHead1_reversed != NULL) ? pHead1_reversed->data : 0;
        int digit2 = (pHead2_reversed != NULL) ? pHead2_reversed->data : 0;
        int sum = digit1 + digit2 + carry;
        carry = sum / 10;
        Node* newNode = (Node*)malloc(sizeof(Node));
        if (newNode == NULL) {
            printf("malloc failed for result node \n");
            exit(1);
        }
        newNode->data = sum % 10;
        newNode->next = NULL;
        if (resultHead == NULL) {
            resultHead = newNode;
        }
        else {
            Node* temp = resultHead;
            while (temp->next != NULL) {
                temp = temp->next;
            }
            temp->next = newNode;
        }
        if (pHead1_reversed != NULL) pHead1_reversed = pHead1_reversed->next;
        if (pHead2_reversed != NULL) pHead2_reversed = pHead2_reversed->next;
    }
    destroy_list(pHead1_reversed);
    destroy_list(pHead2_reversed);
    result_reversed = reverse(resultHead);
    destroy_list(resultHead);
    return result_reversed; 
}

void print_list(Node* hHead)
{
    Node* pHead = (Node*)hHead;

    printf("*******\n");
    while (pHead != NULL)
    {
        printf("%d\n", pHead->data);
        pHead = pHead->next;
    }
    printf("*******\n");
}



Node* reverse(Node* hHead)
{
    Node* resultHead = NULL;
    Node* next;
    while (hHead != NULL) {
        Node* newNode = (Node*)malloc(sizeof(Node));
        if (newNode == NULL) {
            printf("malloc failed for result node \n");
            exit(1);
        }
        newNode->data = hHead->data;
        newNode->next = resultHead;
        resultHead = newNode;
        hHead = hHead->next;
    }
    return resultHead;
}

尝试将 pHead2_reversed 设置为 NULL,但没有成功。还尝试直接在反向函数中释放节点,而不是使用函数调用。上面是我的主驱动文件,下面是功能实现文件。

c data-structures linked-list
1个回答
1
投票

你在

list_sum
中泄漏了内存:

虽然你有:

destroy_list(pHead1_reversed);
destroy_list(pHead2_reversed);

...这些指针并不指向这些反向列表的头部,因为您在前面的循环中将它们向前移动了:

    if (pHead1_reversed != NULL) pHead1_reversed = pHead1_reversed->next;
    if (pHead2_reversed != NULL) pHead2_reversed = pHead2_reversed->next;

在循环之前,您必须保留对这些头的引用,然后释放从这些头节点开始的列表。

© www.soinside.com 2019 - 2024. All rights reserved.