新的Qt5信號和插槽語法使我們不僅可以將信號連接到插槽,還可以連接到普通的舊功能和仿函數/ lambdas。現在的問題是,lambda是帶有()運算符的基本對象,當你連接信號給它們時,它們會被複制到qt內部類的某個地方。而且,當你斷開該仿函數的信號時,它保持在qt內部。我不明白,這是一種正常的行爲?或者也許有辦法在斷開連接後銷燬這些功能對象?Qt5新信號到lambda連接內存泄漏
下面是一個例子:
//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
現在,當我看插槽斷開連接後可變的強引用計數,它停留2,這意味着仿函數對象本身仍然活得很好,雖然它現在對我來說毫無用處。我想念什麼?
會發生什麼事,當你破壞了計時器? –
也有這樣的想法,但引用計數仍然保持2 =/ – Sigil
如果我不在該*'connection.data()='部分中存儲連接變量並刪除該計時器,則唯一方法是1。這仍然很奇怪。 – Sigil