C++ lambda const 值引用在线程中被删除
C++ lambda const value reference got deleted in thread
我遇到过以下情况:
void Plugin::sendMessage(const QString& jid, const QString &message) {
qDebug() << "SENDING TO JID1: " << jid;
QtConcurrent::run([&, this]() {
qDebug() << "SENDING TO JID2: " << jid;
}
}
产生下一个输出:
SENDING TO JID1: "test@xmpp.org"
SENDING TO JID2: "
然后它崩溃了。看起来 jid
不再存在于 lambda 中,但为什么呢?那么如何在这段代码中通过引用使用变量呢?
如果您来自 Java 背景,请注意 C++ 中的引用和 Java 中的引用含义非常不同。在 Java 中,引用被垃圾收集,因此很容易根据需要延长它们的生命周期。在 C++ 中没有垃圾收集,引用变量的生命周期与引用对象的生命周期几乎没有关系。
另请参阅 C++ References and Java References or Programmers Why do C++ and Java both use the notion of “reference” but not in the same sense? 了解更多说明。
我遇到过以下情况:
void Plugin::sendMessage(const QString& jid, const QString &message) {
qDebug() << "SENDING TO JID1: " << jid;
QtConcurrent::run([&, this]() {
qDebug() << "SENDING TO JID2: " << jid;
}
}
产生下一个输出:
SENDING TO JID1: "test@xmpp.org"
SENDING TO JID2: "
然后它崩溃了。看起来 jid
不再存在于 lambda 中,但为什么呢?那么如何在这段代码中通过引用使用变量呢?
如果您来自 Java 背景,请注意 C++ 中的引用和 Java 中的引用含义非常不同。在 Java 中,引用被垃圾收集,因此很容易根据需要延长它们的生命周期。在 C++ 中没有垃圾收集,引用变量的生命周期与引用对象的生命周期几乎没有关系。
另请参阅 C++ References and Java References or Programmers Why do C++ and Java both use the notion of “reference” but not in the same sense? 了解更多说明。