做leetcode过程中遇到heap-use-after-free问题的解决方法
heap-use-after-free
- 背景:leetcode 25 K个一组翻转链表
- 用了很长时间解决这个问题,过程中心态甚至有一点小小波动。
文章图片
- 问题解释:堆在释放后使用,意思是我使用了释放后的空间吗??(看了程序没有发现问题)
- 由于之前没有遇到过类似问题,所以选择了在网上寻找答案,看看有没有遇到相同问题的同学分享经验:
发现有位同学分享的是delete之后再次使用空间,就会报相同错,可是我并没有使用delete。 - 再找了一会发现没有能利用的,大多是对于这个错误的解释和工具使用方法,所以选择自己寻找错误位置然后解决。
/**
- Definition for singly-linked list.
- struct ListNode {
-int val;
-ListNode *next;
-ListNode(int x) : val(x), next(NULL) {}
- };
*/
class Solution {
public:
ListNode* reverseKGroup(ListNode* head, int k) {
ListNode *res=new ListNode;
ListNode *p=head,*r=head;
;
ListNode *q=res;
stack s;
while(p!=NULL){
int n=k;
while(n){
if(p==NULL){
while(r){
q->next=r;
r=r->next;
q=q->next;
}
return res->next;
}
s.push(p);
p=p->next;
n--;
}
while(!s.empty()){
q->next=s.top();
s.pop();
q=q->next;
}
if(p==NULL) return res->next;
r=p;
}
return res->next;
}
};
出错测试用例:
[1,2]
2
经过多次测试发现,只要是链表长度能被K整除就出错,也就是入栈循环结束后p为null
寻错过程:
- 在程序过程中使用return res来定位出错的位置。(print大法芜湖~)
- 在while(n)循环结束后使用,程序可以运行
- 在while(!s.empty())循环结束后运行,出错。由此确定错误出在出栈循环运行中
- 在while(!s.empty())循环中使用,发现第一次循环后并不会出错
- 将while循环换成for的形式,发现在第二次循环(其实是最后一次,因为这道题k是2所以是第二次),也就是链表反转完出错。
出错时链表情况:p为空,无指向,结果链表中有一个环,环由最后一组参与反转的结点组成。
由此推测出现错误的原因:
- 没有指向NULL的结点(原因还在探寻,是因为单链表没有结束的标志吗??)
【做leetcode过程中遇到heap-use-after-free问题的解决方法】解决后成功运行的代码(改动部分):
for(int i=0;
inext=s.top();
//if(i==1) return res;
s.pop();
q=q->next;
q->next=NULL;
//if(i==1) return q;
}
推荐阅读
- 我要做大厨
- 2.6|2.6 Photoshop操作步骤的撤消和重做 [Ps教程]
- 我从来不做坏事
- 子龙老师语录
- 做一件事情的基本原理是什么()
- 做个俗物有什么不好
- 28岁|28岁,做一个通透又自由的姑娘。
- 【Leetcode/Python】001-Two|【Leetcode/Python】001-Two Sum
- leetcode|leetcode 92. 反转链表 II
- 良心