Новый сигнал Qt5 к утечке памяти лямбда-соединений
Новый синтаксис сигналов и слотов Qt5 позволяет нам связывать сигналы не только со слотами, но и с простыми старыми функциями и функторами / лямбдами. Теперь проблема в том, что лямбды являются объектами с оператором (), и когда вы подключаете к ним сигналы, они копируются куда-то во внутренние классы qt. И когда вы отсоединяете сигнал от этого функтора, он остается внутри qt. Я не понимаю, это нормальное поведение? Или, может быть, есть способ уничтожить эти функциональные объекты после отключения?
Вот'Вот пример:
//example
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QTimer* timer = new QTimer();
QSharedPointer 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