做leetcode过程中遇到heap-use-after-free问题的解决方法

heap-use-after-free

  • 背景:leetcode 25 K个一组翻转链表
  • 用了很长时间解决这个问题,过程中心态甚至有一点小小波动。
问题截图:
做leetcode过程中遇到heap-use-after-free问题的解决方法
文章图片

  • 问题解释:堆在释放后使用,意思是我使用了释放后的空间吗??(看了程序没有发现问题)
  • 由于之前没有遇到过类似问题,所以选择了在网上寻找答案,看看有没有遇到相同问题的同学分享经验:
    发现有位同学分享的是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

寻错过程:
  1. 在程序过程中使用return res来定位出错的位置。(print大法芜湖~)
  2. 在while(n)循环结束后使用,程序可以运行
  3. 在while(!s.empty())循环结束后运行,出错。由此确定错误出在出栈循环运行中
  4. 在while(!s.empty())循环中使用,发现第一次循环后并不会出错
  5. 将while循环换成for的形式,发现在第二次循环(其实是最后一次,因为这道题k是2所以是第二次),也就是链表反转完出错。
    出错时链表情况:p为空,无指向,结果链表中有一个环,环由最后一组参与反转的结点组成。
    由此推测出现错误的原因:
  • 没有指向NULL的结点(原因还在探寻,是因为单链表没有结束的标志吗??)
解决方法:在结点出栈的时候使出栈结点指向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; }

    推荐阅读