【问题标题】:On C++ lamdas and QTimer. What does this warning mean, and how to get rid of it? [duplicate]在 C++ lamdas 和 QTimer 上。这个警告是什么意思,以及如何摆脱它? [复制]
【发布时间】:2021-10-20 04:05:48
【问题描述】:

这个问题被标记为与 qt 的 connect 方法有关的另一个问题的重复。但由于我的代码确实 not 调用 connect 我的问题不能重复。也许这两个问题的答案在某种程度上是相关的,但是这两个问题并不相似。

我正在使用 Mac 上的 Qt Creator 进行 C++ 编程(clang 编译器)。

如上图所示,如下代码行:

QTimer::singleShot(100.0, [this](){ this->timeout();});

产生警告:

将上下文对象作为第二个 singleShot 参数传递 [clazy-connect-3arg-lambda]

这个警告是什么意思以及如何消除它?

【问题讨论】:

  • 警告旨在让您考虑对象生命周期,这在(并发)编程中非常重要。考虑“this”指针在 100 毫秒后不再有效的情况。 Qt 计时器将回调一个不再存在的对象。这看起来像一个误报(我假设这个对象存在很长时间)所以你必须查看 Qt 手册以了解如何抑制这个警告
  • @paxdiablo,我不知道如何解释 github 评论。警告是“误报”吗?或者我应该使用一个重载来接受一个“上下文对象”的singleShot?我不确定那是什么意思。

标签: c++ qt lambda qtimer


【解决方案1】:

this post解释Qt中上下文的概念。 在您的情况下,我相信通过 this 作为上下文将解决您的问题。

【讨论】:

  • 如果“context”应该是从 QObject 派生的对象,那么“this”将不起作用。但由于我的对象将在应用程序的生命周期内保留,我想我可以忽略警告 (?)。
  • @ragnarius 如果this 没有指向QObject 实例,那么我认为您除了将警告视为误报之外别无选择,因为如果对象在信号发出之前就被删除了,Qt无从得知。
猜你喜欢
  • 2015-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-02
  • 1970-01-01
  • 2014-11-02
  • 2015-06-22
  • 2013-06-25
相关资源
最近更新 更多