C++ lambda搭配QTimer触发的clazy警告含义及消除方法
警告含义
该告警是Qt配套的clazy静态代码检查工具抛出的安全提示,虽然你没有手动调用connect方法,但QTimer::singleShot的lambda重载版本底层依赖Qt信号槽机制实现,和connect的lambda调用存在相同的安全隐患,因此会触发该检查规则。
告警的核心风险提示:你当前的写法没有给lambda绑定关联的上下文对象,若定时器超时触发前,this指向的对象已经被销毁,lambda执行时访问this就会触发悬空指针崩溃,Qt没有机制在上下文销毁时自动取消该次超时回调。
消除警告的方案
- 方案1(推荐):使用带上下文参数的
QTimer::singleShot重载,补充传入this作为第二个参数:
QTimer::singleShot(100.0, this, [this](){ this->timeout();});
添加上下文对象后,当this指向的对象被销毁时,Qt会自动取消未触发的定时器回调,从根源避免悬空指针问题,同时直接消除告警。
- 方案2(不推荐,仅当你100%确认回调触发前
this一定有效时使用):在代码行添加clazy检查抑制注释:
// clazy:exclude=connect-3arg-lambda QTimer::singleShot(100.0, [this](){ this->timeout();});
内容的提问来源于stack exchange,提问作者ragnarius
相关产品推荐
相关产品推荐

