• Qt 中 deleteLater 使用总结


    背景

    deleteLater 是 QObject 类对象的成员函数,用于延迟删除一个 QObject 类对象,且对 QObject 类对象的删除推荐使用 deleteLater 而非 delete 。

    deleteLater

    ①.概述

    deleteLater 依赖于事件循环,调用 deleteLater 后本质是发送了一个 DeferrerDelete 事件,在事件循环处理中把对象删除。

    ②.代码示例

    demo = new QtClassDemo(this);
    demo->deleteLater();
    demo = nullptr;
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    deleteLater 和 delete

    ①.deleteLater 会在当前对象的所有事件处理完成后再删除对象

    demo = new QtClassDemo(this);
    demo->setObjectName("demo");
    
    qApp->postEvent(demo, new CustomEvent("hello"));
    qApp->postEvent(demo, new CustomEvent("world"));
    
    demo->deleteLater();
    demo = nullptr;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在这里插入图片描述

    ②.delete 则是立即删除对象,对象的既有事件不再处理

    demo = new QtClassDemo(this);
    demo->setObjectName("demo");
    
    qApp->postEvent(demo, new CustomEvent("hello"));
    qApp->postEvent(demo, new CustomEvent("world"));
    
    delete demo;
    demo = nullptr;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在这里插入图片描述

    ③.deleteLater 后依然可以访问和操作对象,直到再次回到事件循环

    demo = new QtClassDemo(this);
    demo->setObjectName("demo");
    
    demo->deleteLater();
    
    qDebug() << demo->objectName();
    demo = nullptr;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在这里插入图片描述

    deleteLater 和 QSharedPointer

    ①.概述

    智能指针可以传入自定义的删除器,对于继承自 QObject 的类对象可以传入 deleteLater 。

    ②.代码示例

    QSharedPointer<QtClassDemo> demoClass(new QtClassDemo(this), &QObject::deleteLater);
    
    • 1

    在这里插入图片描述

    deleteLater 和 moveToThread

    ①.概述

    moveToThread 的本质是把 QObject 对象到事件循环移动到子线程进行处理:

    qDebug() << "主线程:"<< QThread::currentThread();
    QThread * workThread = new QThread;
    
    demo = new QtClassDemo(nullptr);
    demo->setObjectName("demo");
    demo->moveToThread(workThread);
    workThread->start();
    
    bool QtClassDemo::event(QEvent * event)
    {
      qDebug() << "事件处理线程:"<< QThread::currentThread() << event->type();
    
      return QObject::event(event);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    在这里插入图片描述

    ②.利用 deleteLater 进行资源清理

    //工作对象工作完成,停止线程
    QObject::connect(workObject,&WorkObject::workFinished,[&](){
        workThread->quit();
        workThread->wait();
    });
    //工作线程停止,删除工作对象
    QObject::connect(workThread,&QThread::finished,workObject,&WorkObject::deleteLater );
    //工作对象销毁,删除工作线程
    QObject::connect(workObject,&WorkObject::destroyed,workThread,&QThread::deleteLater );
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在这里插入图片描述

  • 相关阅读:
    【iOS逆向与安全】插件开发之某音App直播间自动发666
    C语言-atof函数介绍
    js中 slice 用法用法全解析
    乙二醇除铁离子
    五、Spring Boot 整合持久层技术(4)
    HTTPS一定安全吗
    从神一到神十三,探索中国航天背后“神秘”力量
    代码质量与安全 | 嵌入式开发中不得不说的编码标准——Barr-C
    新库上线 | CnOpenData农产品批发价格数据
    Git常用命令归纳
  • 原文地址:https://blog.csdn.net/lizhichao410/article/details/125443272