我有以下代碼:瞭解QTimer用Lambda和遞歸函數調用
void class::Testfunc()
{
QTimer* timer = new QTimer;
QObject::connect(timer, &QTimer::timeout, [this](){
emit Log("Time out...");
TestFunc(serverAddress, requestsFolderPath);
// deleteLater(); //*** why does this crash if used to replace the connect below?
});
connect(timer, &QTimer::timeout, timer, &QTimer::deleteLater);
timer->setSingleShot(true);
timer->start(1000);
}
單觸發定時器與連接到該記錄的入口lambda函數每個第二(打印lambda函數一個timout創建文本到標準輸出)並再次調用該函數。
這工作沒有問題。但是,如果我將deleteLater(在lambda函數下)的連接調用刪除,但在lambda函數中啓用deleteLater調用,則該函數將失敗。它打印一次後不久,在試圖刪除定時器對象時崩潰。
這個實例中的兩個deleteLater調用有什麼區別,以及爲什麼將deleteLater放在lambda函數中會導致問題,而創建單獨的連接則按預期工作,即使兩者都調用deleteLater以響應定時器超時信號?
deleteLater()似乎是你的類,而不是拉姆達內部的定時器,或者是隻是一個錯字? – lpapp 2014-11-03 12:11:34
是的,因爲@lpapp說lambda中的'deleteLater'調用'myclass :: deleteLater'而不是'QTimer :: deleteLater'。因此,確保你同時捕獲'[this,timer]'並使用'timer-> deleteLater();' – PeterT 2014-11-03 12:21:14