Qt5 novo sinal para vazamento de memória de conexões lambda
A nova sintaxe de sinais e slots Qt5 nos permite conectar sinais não apenas a slots, mas também a funções antigas e functors / lambdas. Agora o problema é que os lambdas são essencialmente objetos com o operador (), e quando você conecta sinais a eles, eles são copiados em algum lugar nas classes internas do qt. E, quando você desconecta o sinal daquele functor, ele fica em qt internals. Eu não consigo entender, isso é um comportamento normal? Ou talvez haja uma maneira de destruir esses objetos funcionais após a desconexão?
Aqui está um exemplo:
//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
Agora, quando observo a contagem de referência forte da variável de conexão após a desconexão do slot, ela permanece 2, o que significa que o próprio objeto functor ainda está ativo e bem, embora não seja útil para mim agora. Eu sinto falta de algo?