signal custom c++ c++11 signals qt5 slot

c++ - custom - Qt5 nueva señal para la pérdida de memoria de las conexiones Lambda



qt connect (1)

El ejemplo está sobre diseñado (¿por qué usar un QSharedPointer? ¿Por qué capturarlo por valor ?). Pero de hecho Qt está perdiendo el objeto funtor.

El punto es que la lista de conexión interna simplemente se marca como sucia y no se borra hasta que se elimine el remitente o se conecte una nueva señal (consulte los usos de cleanConnectionLists ).

Presioné un par de parches que deberían solucionar este comportamiento: https://codereview.qt-project.org/#change,42976 and 42979

Las nuevas señales Qt5 y la sintaxis de las ranuras nos permiten conectar señales no solo a las ranuras, sino también a funciones y functors / lambdas antiguos. Ahora el problema es que las lambdas son objetos esenciales con el operador (), y cuando se les conectan señales, se copian en algún lugar de las clases internas de qt. Y, cuando desconecta la señal de ese functor, permanece en qt internals. No entiendo, ¿es eso un comportamiento normal? ¿O tal vez hay una manera de destruir esos objetos funcionales después de la desconexión?

Aquí hay un ejemplo:

//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

Ahora, cuando veo el recuento de referencia fuerte de la variable de conexión después de la desconexión de la ranura, permanece en 2, lo que significa que el objeto funtor en sí todavía está vivo y en buen estado, aunque ahora no me sirve. ¿Echo de menos algo?