C++ Lambda 捕获弄乱了局部变量值

标签 c++ variables lambda local capture

我不确定这是 VS 2010 的问题还是我完全误解了某些东西。我正在通过需要修改局部变量的 lambda 函数创建一个增强线程:

    auto oCurrTime( boost::posix_time::microsec_clock::universal_time() );
    auto spRequestSequenceThread = make_unique<boost::thread>( [&oCurrTime, this]()
    {
        while ( !checkAgainstSpecificTime(oCurrTime) )
        {
            ...
        }
        :
        :
    }

在创建线程之前,oCurrTime 类似于 2864273654234872634,但在线程内该值丢失并且 oCurrTime 立即类似于 487465847564875465,导致 while 循环(计算与某个特定时间的时差)无用。

非常感谢您的帮助。

P.S.: 上面的代码是一个类的一个函数的一部分

最佳答案

看起来您从类方法执行线程 - 您在 lambda 捕获列表中提供了 this。这也意味着 oCurrTime 是局部变量,因此如果您通过引用捕获它:您使用 &,那么当您的线程执行时 oCurrTime 将被删除来自堆栈,因为定义时的作用域已经结束。

解决方案是在可能的情况下按值传递 oCurrTime(删除 &),或者在您的方法结束之前加入您的线程 - 如果可能的话。您还可以将 oCurrTime 设为类变量。

关于C++ Lambda 捕获弄乱了局部变量值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36641257/

相关文章:

c++ - SetDIBits 可以直接绘制到屏幕或监视器吗?

Android 开发 - 使用变量打开原始文件或 Assets 文件

php - 在 if 条件下更改全局变量值,然后在 else 中访问该值

java - 如何在 jdbcTemplate.query 函数之外声明 lambda 表达式?

c# - 从配对列表中删除 'duplicates'

c++ - 使用opencv2后找不到min函数

c++ - DLL中的Rtaudio使程序无响应

c++ - 定义类型的宏

Javascript 对象和全局作用域?

java - 在 Java 8 中迭代枚举