做leetcode过程中遇到heap-use-after-free问题的解决方法 - Go语言中文社区

做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<ListNode* > 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

解决后成功运行的代码(改动部分):

             for(int i=0;i<k;i++){
             //   if(i==1) return s.top();
                q->next=s.top();
             //   if(i==1) return res;
                s.pop();
                q=q->next;
                q->next=NULL;
             //  if(i==1) return q;
            }
版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/cncxycpp/article/details/106057900
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2023-01-02 16:25:42
  • 阅读 ( 297 )
  • 分类:算法

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢