天天看點

Qt 中 deleteLater 使用總結

背景

deleteLater 是 QObject 類對象的成員函數,用于延遲删除一個 QObject 類對象,且對 QObject 類對象的删除推薦使用 deleteLater 而非 delete 。

deleteLater

①.概述

deleteLater 依賴于事件循環,調用 deleteLater 後本質是發送了一個 DeferrerDelete 事件,在事件循環進行中把對象删除。

②.代碼示例

demo = new QtClassDemo(this);
 demo->deleteLater();
 demo = nullptr;      
Qt 中 deleteLater 使用總結

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;      
Qt 中 deleteLater 使用總結

②.delete 則是立即删除對象,對象的既有事件不再處理

demo = new QtClassDemo(this);
 demo->setObjectName("demo");qApp->postEvent(demo, new CustomEvent("hello"));
 qApp->postEvent(demo, new CustomEvent("world"));delete demo;
 demo = nullptr;      
Qt 中 deleteLater 使用總結

③.deleteLater 後依然可以通路和操作對象,直到再次回到事件循環

demo = new QtClassDemo(this);
 demo->setObjectName("demo");demo->deleteLater();
qDebug() << demo->objectName();
 demo = nullptr;      
Qt 中 deleteLater 使用總結

deleteLater 和 QSharedPointer

①.概述

智能指針可以傳入自定義的删除器,對于繼承自 QObject 的類對象可以傳入 deleteLater 。

②.代碼示例

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

deleteLater 和 moveToThread

①.概述

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);
 }      

②.利用 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 );