kevin_org 2024-04-01 15:30 采纳率: 100%
浏览 8
已结题

窗口多次释放后,智能指针出现异常

功能:关闭当前窗口跳转其他界面(该界面有线程在刷新数据)
问题:窗口关闭后,智能指针出现异常,程序奔溃,如下图所示

img

  • 写回答

19条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-04-01 15:31
    关注

    引自免费微信小程序:皆我百晓生

    根据您提供的崩溃信息,程序在尝试读写一个没有足够访问权限的内存地址时触发了一个异常,这通常与对象生命周期管理有关,尤其是当窗口销毁时相关资源未正确释放。对于Qt程序中涉及多线程以及窗口关闭的情况,可能存在以下几种可能的问题和解决方案:

    1. 智能指针管理不当

      • 确保所有跨线程共享的数据都通过std::shared_ptrstd::unique_ptr或者其他适当同步机制进行管理,确保在所有引用它们的对象析构后能自动释放资源。
      // 假设有一个跨线程使用的类实例
      std::shared_ptr<MyClass> sharedData(new MyClass);
      
      // 在窗口关闭时,确保主线程不再持有该智能指针
      sharedData.reset();
      
      // 确保在工作线程中也适时释放对智能指针的引用
      // (例如,在收到某种信号后停止刷新并释放资源)
      
    2. 线程同步问题

      • 当窗口关闭时,确保任何正在刷新数据的线程能够得到通知,并且能安全地结束其执行。
      // 假设使用QThread和QObject
      class Worker : public QObject {
          Q_OBJECT
          QSharedPointer<MyClass> data;
          QTimer m_refreshTimer;
      
      public slots:
          void startWork() {
              connect(&m_refreshTimer, &QTimer::timeout, this, &Worker::refreshData);
              m_refreshTimer.start(1000); // 每秒刷新一次
          }
      
          void stopWork() {
              m_refreshTimer.stop();
              disconnect(); // 断开所有连接,防止对已删除对象的回调
              // 清理数据等资源
          }
      };
      
      // 在窗口关闭槽函数中调用线程停止工作
      void MyWindow::onClose() {
          worker->stopWork();
          worker->thread()->quit(); // 退出线程事件循环
          worker->deleteLater(); // 安全删除worker对象
      }
      
    3. 窗口关闭时资源清理

      • 确保在窗口关闭时,所有关联的成员变量被正确清理,特别是那些在线程中创建或使用的资源。
      ~MyWindow() {
          if (worker != nullptr) {
              worker->stopWork();
              worker->thread()->quit();
              worker->deleteLater();
          }
          // 清理其他相关资源
      }
      
    4. 检查悬挂指针

      • 确保在窗口销毁后,没有其他对象仍试图访问已被释放的窗口资源。如果有,你需要确保在这些对象中解除对窗口资源的引用。

    由于您提供的信息中并没有具体的代码片段和更详细的上下文环境,以上解决方案是基于常规情况下的推断。针对具体问题,建议您结合调试器查看崩溃时堆栈信息,找出实际尝试非法访问内存的代码行,并检查相关的对象生命周期和线程同步逻辑。同时,可以考虑在关键点添加日志输出,辅助定位问题所在。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(18条)

报告相同问题?

问题事件

  • 系统已结题 4月12日
  • 已采纳回答 4月4日
  • 创建了问题 4月1日

悬赏问题

  • ¥15 微信小程序协议怎么写
  • ¥15 c语言怎么用printf(“\b \b”)与getch()实现黑框里写入与删除?
  • ¥20 怎么用dlib库的算法识别小麦病虫害
  • ¥15 华为ensp模拟器中S5700交换机在配置过程中老是反复重启
  • ¥15 java写代码遇到问题,求帮助
  • ¥15 uniapp uview http 如何实现统一的请求异常信息提示?
  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看