Die neue Qt5-Signale und Slots-Syntax ermöglicht es uns, Signale nicht nur an Slots, sondern auch an alte Funktionen und Funktoren/Lambdas zu verbinden. Nun ist das Problem, dass Lambdas wesentliche Objekte mit() Operator sind, und wenn Sie Signale mit ihnen verbinden, werden sie irgendwo in qt internen Klassen kopiert. Und wenn Sie das Signal von diesem Funktor trennen, bleibt es in qt internes. Ich verstehe nicht, ist das ein normales Verhalten? Oder gibt es eine Möglichkeit, diese funktionalen Objekte nach der Trennung zu zerstören?Qt5 neues Signal zu Lambda-Verbindungen Speicherleck
Hier ist ein Beispiel:
//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
Jetzt, als ich zählt starke Referenz der Verbindung variabel zu buchen, nach der Schlitz Trennung, es 2 bleibt, was bedeutet, dass das Funktor Objekt selbst noch am Leben ist und gut, obwohl es Es nützt mir jetzt nichts. Vermisse ich etwas?
Was, wenn Sie den Timer zerstören passiert? –
Hatte das auch gedacht, aber der Referenzzähler bleibt immer noch 2 =/ – Sigil
Der einzige Weg geht zu 1, wenn ich die Verbindungsvariable nicht in diesem '* connection.data() =' Teil ablege und den Timer lösche. Was immer noch sehr seltsam ist. – Sigil