【发布时间】:2014-12-30 02:06:31
【问题描述】:
我有以下代码:
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 函数的 timout 创建单次计时器,该函数每秒记录 lambda 函数的入口(将文本打印到标准输出)并再次调用该函数。
这没有问题。但是,如果我删除了对 deleteLater 的连接调用(在 lambda 函数下方),但在 lambda 函数中启用了 deleteLater 调用,则该函数将失败。它会打印一次,然后在尝试删除计时器对象时崩溃。
在这种情况下,两个 deleteLater 调用之间有什么区别,为什么将 deleteLater 放在 lambda 函数中会导致这里出现问题,而创建单独的连接按预期工作,即使两者都调用 deleteLater 以响应 Timer 的超时信号?
【问题讨论】:
-
deleteLater() 似乎适用于您的课程,而不是 lambda 中的计时器,或者这只是一个错字?
-
是的,正如 @lpapp 在 lambda 中所说的
deleteLater调用myclass::deleteLater而不是QTimer::deleteLater。因此,请确保同时捕获[this,timer]并使用timer->deleteLater();
标签: c++ qt c++11 lambda qtcore