c - 队列的 pop() 中的内存泄漏

标签 c memory-leaks

我的pop 功能似乎没有正常工作。基本上,我的队列 有一个指向第一个和最后一个元素的指针。

我的 pop 函数首先释放第一个元素并将其分配给 NULL

然后它每次都使用指针curr 到达下一个元素,直到找到NULL

最后,我队列中的第一个指针被分配给 prev,它指向我的 curr 达到 null 之前的最后一个元素。

#include <stdlib.h>

struct Queue {
    struct Node* first;
    struct Node* last;
};

struct Node {
    Item val;
    struct Node* next;
};


void initQueue (struct Queue **queue){
    (*queue) = malloc(sizeof(struct Queue));
    (*queue)->first = NULL;
    (*queue)->last = NULL;
}

struct Node* createNewNode(){
    struct Node *newNode;
    newNode = malloc(sizeof(struct Node));
    newNode->next = NULL;

    return newNode;
}



void push (Item val, struct Queue *queue){
    struct Node* newNode = createNewNode();
    newNode->val = val;


    if(queue->first == NULL){
        queue->first = newNode;
        queue->last = newNode;
    }

    else{
        newNode->next = queue->last;
        queue->last = newNode;
    }
}

void pop(struct Queue *queue){

    struct Node* curr = queue->last;
    struct Node* prev = queue->last;


    free(queue->first);
    queue->first = NULL;

    while(curr != NULL){
        prev = curr;
        curr = curr->next;
    }

    queue->first = prev;

}

最佳答案

要从列表的前面弹出,只需将 first 指向 first->next

void pop(struct Queue *queue)
{
    if (NULL != queue->first) {
        struct Node *first = queue->first;
        // Update first ptr
        queue->first = queue->first->next;
        free(first);
        // Only need to update tail if list is empty
        if (NULL == queue->first) {
            queue->last = NULL;
        }
    }
}

编辑 根据您的评论,您似乎没有看到我在做什么,所以这里有一个例子。

假设队列是这样的:

queue->first

A → B → C → D ← queue->last

首先,创建一个临时指针并让它指向queue->first。然后移动queue->first,使其指向queue->first->next。该列表现在如下所示:

queue->first

A → B → C → D ← queue->last

首先(临时变量)

然后,删除临时变量,列表为:

queue->first

B → C → D ← queue->last

EDIT 2 我还注意到您的 push 功能不正确。在队列中,您将新项目添加到列表的末尾并从前面取出项目(FIFO - 先进先出)。就像人们排队看表演一样。 第一个到达那里并排队的人将第一个进入剧院。而最后到达的人排在队伍的后面。所以 push 应该是:

void push (Item val, struct Queue *queue){
    struct Node* newNode = createNewNode();
    newNode->val = val;

    if(queue->first == NULL) {
        queue->first = newNode;
        queue->last = newNode;
    }
    else{
        queue->last->next = newNode;  // Add to END of list
        queue->last = newNode;
    }
}

关于c - 队列的 pop() 中的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43150378/

相关文章:

c - &variable 作为表达式在 c 中意味着什么

c# - 使用 block 从内部返回一次性对象

c - 使用 fopen 和测试 NULL 的奇怪 C 行为

C 生成文件 RE : build dependencies to properly find objects in their respective directory

c 链式困惑

c - MD5 将 uint8_t 转换为字符串

c# - 如何释放 C# 中从 Rust 返回的字符串的内存?

c - strlen 和 malloc : C memory leaks

ios - 呈现 SpriteKit 场景时出现内存泄漏

c - 我的(自定义)程序如何泄漏内存?我正在为 pset5 做准备