You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

LeetCode 707 设计链表代码中heap-use-after-free错误排查求助

LeetCode 707 设计链表代码中heap-use-after-free错误排查求助

我最近在做LeetCode的「设计链表」题目时,写了下面的C语言实现,但运行测试时遇到了堆内存释放后仍被使用的错误,想请大家帮忙找出问题所在。

以下是我的实现代码:

typedef struct MyLinkedList{
    int val;
    struct MyLinkedList *next;
} MyLinkedList, *LinkList;


MyLinkedList* myLinkedListCreate() {
    LinkList p = (LinkList)malloc(sizeof(MyLinkedList));
    p->val = 0;
    p->next = NULL;
    return p;
}

int myLinkedListGet(MyLinkedList* obj, int index) {
    int i = 0;
    LinkList p = obj;
    while(p != NULL){
        if(i == index) return p->val;
        else{
            p = p->next;
            i++;
        }
    }
    return -1;
}

void myLinkedListAddAtHead(MyLinkedList* obj, int val) {
    MyLinkedList *new = (MyLinkedList *)malloc(sizeof(MyLinkedList));
    new->val = val;
    new->next = obj;
    obj = new;
}

void myLinkedListAddAtTail(MyLinkedList* obj, int val) {
    MyLinkedList *tail = (MyLinkedList *)malloc(sizeof(MyLinkedList));
    tail->next = NULL;
    tail->val = val;
    LinkList p = obj;
    while(p->next != NULL){
        p = p->next;
    }
    p->next = tail;
}

void myLinkedListAddAtIndex(MyLinkedList* obj, int index, int val) {
    MyLinkedList *node = (MyLinkedList*)malloc(sizeof(MyLinkedList));
    node->val = val;
    LinkList p = obj;
    for(int i = 0; i != index - 1; i++){
        p = p->next;
    }
    if(p == NULL) return;
    node->next = p->next;
    p->next = node;
}

void myLinkedListDeleteAtIndex(MyLinkedList* obj, int index) {
    LinkList p = obj;
    int i = 0;
    if(index < 0) return ;
    if(index == 0){
        LinkList q = obj;
        obj = obj->next;
        free(q);
        return ;
    }
    while(i != index - 1){
        p = p->next;
    }
    LinkList q;
    q = p->next;
    p->next = p->next->next;
    free(q);
}

void myLinkedListFree(MyLinkedList* obj) {
    LinkList p = obj;
    while (p) {
        LinkList q = p;
        p = p->next; //maybe this line wrong
        free(q);
    }
}

题目提供的代码模板说明,我的实现会被这样调用:

/**
 * Your MyLinkedList struct will be instantiated and called as such:
 * MyLinkedList* obj = myLinkedListCreate();
 * int param_1 = myLinkedListGet(obj, index);
 
 * myLinkedListAddAtHead(obj, val);
 
 * myLinkedListAddAtTail(obj, val);
 
 * myLinkedListAddAtIndex(obj, index, val);
 
 * myLinkedListDeleteAtIndex(obj, index);
 
 * myLinkedListFree(obj);
*/

当我运行LeetCode的测试用例时,收到了如下错误:

22ERROR: AddressSanitizer: heap-use-after-free on address 0x602000000718 at pc 0x55b42a509da3 bp 0x7fffa049ff00 sp 0x7fffa049fef0

请问我的代码里哪里存在bug,导致了这个heap-use-after-free错误呢?

备注:内容来源于stack exchange,提问作者Clay_Han

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.15 09:39:50