myml / myml.github.io

myml的个人网站
https://myml.dev
3 stars 0 forks source link

不要在 eventLoop 之前使用 deleteLater #41

Open myml opened 1 year ago

myml commented 1 year ago

eventLoop 可用于同步等待信号,deleteLater 可以延迟删除对象,但不能在 eventLoop 之前使用 deleteLater。

因为 eventLoop 不会阻塞主线程事件,而 deleteLater 会在主线程下次循环时被调用,如果使用 eventLoop 等待对象的信号,而在 eventLoop.exec() 之前调用了对象的 deleteLater 方法,对象会被删除,eventLoop 永远无法等到对象的信号。

例子:

QNetworkRequest request(url);
QNetworkReply *reply = m_http->get(request);
reply->deleteLater(); // 错误
QEventLoop eventLoop;
connect(reply, &QNetworkReply::finished, &eventLoop, &QEventLoop::quit);
eventLoop.exec();
reply->deleteLater(); // 正确