Matcha芥末酱 2023-09-25 17:34 采纳率: 37.5%
浏览 15
已结题

链表入队的指针内存问题

在Qt上用链表进行队列的出入队操作,当需要处理的数据量比较大的时候,程序会在某次入队的为指针分配内存处中断

void Queue::enqueue(const QPoint xy,const QPoint dad){
    Point* point_ ;
    point_=new Point;
    point_->fatherpoint=dad;
    point_->xy=xy;
    point_->next=nullptr;
    if(isEmpty()){
        front=rear=point_;
    }else{
        rear->next=point_;
        rear=point_;
    }
}

这是一个链表的入队操作,Point是我自定义的一个类,每次程序都会在point_=new Point;这行中断。这个入队操作的point_指针是没法delete的,因为尾节点和point_指针指向同一处内存。但是当我需要调用这个函数的次数变多的时候,就会中断。我想知道具体的原因以及解决办法。
我看有博客写的是多次用同一个指针开辟内存会导致问题https://blog.csdn.net/sieyoo/article/details/51105396。但是就算我改成建立一个可扩容的指针数组来每次初始化数组中的不同指针最终也会在qarraydata.cpp的headerSize > size_t(MaxAllocSize)和QArrayData *header = static_cast<QArrayData *>(::malloc(allocSize));这两行中断。所以说有没有人能给出一个切实可行的解决方案啊

  • 写回答

18条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2023-09-25 18:17
    关注
    获得0.60元问题酬金

    引自免费小程序-皆我百晓生,希望对题主有所帮助,如有帮助,还望采纳。


    对于FIFO队列,入队操作应该是往队列的尾部添加新节点,而不需要修改头节点。我之前给出的代码示例有误,请忽略。

    在你的代码中,每次入队操作的逻辑是正确的,只需要修改一点来释放前一个节点,从而避免内存泄漏。这样:

    void Queue::enqueue(const QPoint xy,const QPoint dad){
        Point* point_ = new Point;
        point_->fatherpoint = dad;
        point_->xy = xy;
        point_->next = nullptr;
     
        if (isEmpty()){
            front = rear = point_;
        } else {
            rear->next = point_;
            rear = point_;
        }
     
        // 释放前一个节点
        if (front != nullptr) {
            Point* temp = front;
            front = front->next;
            delete temp;
        }
    }
    

    在每次入队操作后,如果队列不为空(即front指针不为空),就将front指针指向下一个节点,然后删除前一个节点。这样确保了队列的FIFO特性,并且避免了内存泄漏。

    评论

报告相同问题?

问题事件

  • 系统已结题 10月3日
  • 创建了问题 9月25日

悬赏问题

  • ¥15 如何让企业微信机器人实现消息汇总整合
  • ¥50 关于#ui#的问题:做yolov8的ui界面出现的问题
  • ¥15 如何用Python爬取各高校教师公开的教育和工作经历
  • ¥15 TLE9879QXA40 电机驱动
  • ¥20 对于工程问题的非线性数学模型进行线性化
  • ¥15 Mirare PLUS 进行密钥认证?(详解)
  • ¥15 物体双站RCS和其组成阵列后的双站RCS关系验证
  • ¥20 想用ollama做一个自己的AI数据库
  • ¥15 关于qualoth编辑及缝合服装领子的问题解决方案探寻
  • ¥15 请问怎么才能复现这样的图呀