La nuova sintassi di segnali e slot Qt5 ci consente di collegare segnali non solo a slot, ma anche a semplici vecchie funzioni e funzioni/lambda. Ora il problema è che i lambdas sono essenzialmente oggetti con operatore(), e quando si collegano i segnali a loro, vengono copiati da qualche parte nelle classi interne di qt. E, quando disconnetti il segnale da quel functor, rimane in qt internals. Non riesco a capire, è un comportamento normale? O forse c'è un modo per distruggere quegli oggetti funzionali dopo la disconnessione?Qt5 nuovo segnale per perdita di memoria connessioni lambda
Ecco un esempio:
//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
Ora, quando guardo forte conteggio di riferimento variabile connection dopo la fessura disconnessione, rimane 2, il che significa che l'oggetto funtore stesso è ancora viva e, sebbene non serve a me ora. Mi manca qualcosa?
cosa succede quando si distruggono il timer? –
Aveva anche questo pensiero, ma il conteggio dei riferimenti rimane 2 =/ – Sigil
L'unico modo in cui va a 1 se non memorizzo la variabile di connessione in quella parte '* connection.data() =' ed elimina il timer. Che è ancora molto strano – Sigil