Skip to content

不要在 eventLoop 之前使用 deleteLater #41

@myml

Description

@myml

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(); // 正确

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions