QT5新信号拉姆达连接内存泄漏(Qt5 new signal to lambda connectio

2019-07-05 02:02发布

新QT5信号和槽语法允许我们连接信号不仅插槽,而且还颠覆了旧的功能和仿函数/ lambda表达式。 现在的问题是,lambda表达式与()运算符essentialy对象,而当你的信号连接到它们,它们就在QT内部类地方复制。 而且,当你从该函子断开信号,它停留在QT内部。 我不明白,是一种正常的行为? 或者,也许有一种方法来破坏断线后的功能对象?

下面是一个例子:

//example

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QTimer* timer = new QTimer();

    QSharedPointer<QMetaObject::Connection> connection(new QMetaObject::Connection());

    //functor is created and gets copied inside qt internals, connection variable is captured
    //inside the functor

    *connection.data() = QObject::connect(timer, &QTimer::timeout, [=]
    {
        qDebug() << "disconnected";
        QObject::disconnect(*connection.data());
    });

    timer->start(10000);

    return a.exec();
}

//example

现在,当我插槽断开后看连接变量的强引用计数,它停留2,这意味着仿函数对象本身是仍然健在的,虽然它是没有用的我。 难道我错过了什么?

Answer 1:

的例子中是过度设计(为什么使用QSharedPointer?为何通过捕获吗?)。 不过说实在的Qt是泄漏的仿函数对象。

的一点是,直到该发送者被删除或者新的信号连接(见的用途内部连接列表被简单地标记为脏的,而不是被清除cleanConnectionLists )。

我推了几个补丁应该解决这个行为: https://codereview.qt-project.org/#change,42976和42979



文章来源: Qt5 new signal to lambda connections memory leak