提问人:MeYokYang 提问时间:11/21/2022 更新时间:11/21/2022 访问量:66
在 Leetcode 中获取 heap-use-after-free
get heap-use-after-free in Leetcode
问:
我有一个 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;
}
运行后,出现堆释放后使用错误。我该如何解决?
答:
-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 是节点的成员。我释放了标志,但没有释放节点。
评论
p->next = flag
flag