在 Leetcode 中获取 heap-use-after-free

get heap-use-after-free in Leetcode

提问人:MeYokYang 提问时间:11/21/2022 更新时间:11/21/2022 访问量:66

问:

我有一个 Leetcode 问题,No.142,链表周期 II。我的代码就是这样:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode *detectCycle(struct ListNode *head) {

    struct ListNode *flag = (struct ListNode *)malloc(sizeof(struct ListNode));
    int count = 0;

    while (head != NULL) {

        if (head -> next == flag) {
            free(flag);
            return head -> val;
        }

        head -> val = count;
        ++count;

        struct ListNode *p = head;
        head = head -> next;
        p -> next = flag;

    }

    free(flag);
    return -1;

}

运行后,出现堆释放后使用错误。我该如何解决?

c malloc 堆内存 空闲

评论

0赞 MeYokYang 11/21/2022
检查每个节点后,我会将其 NEXT 更改为 FLAG,将 VAL 更改为 index(also count)。如果有循环,则 head -> 下一个将是 FLAG。在这种情况下,我可以返回 val。
0赞 qrdl 11/21/2022
您正在修改不应执行的列表。并且在循环内不会改变。p->next = flagflag

答:

-1赞 MZM 11/21/2022 #1

只需在 flag 空闲之前使用 temp 变量存储 head->val,然后返回 val,请参阅下面的代码。

if (head -> next == flag) {
    int val = head->val;    
    free(flag);
    return val;
}

代码中只有两个位置可以释放内存。 我只是在解决你遇到的错误。我会通过执行以下操作来修改代码以具有单个 return & free 语句:

  int returnVal = -1;
  while loop  {

   if (head -> next == flag) {
    returnVal = head->val;
     break;     //exit while loop
   } else  {

     .
     .
     .
 
   }
}     // end while
free(flag);
return returnVal;

评论

0赞 MeYokYang 11/21/2022
这是行不通的。Flag 是节点的成员。我释放了标志,但没有释放节点。