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

C++ Lambda capture messing up local variable value

我不确定这是 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.: 上面的代码是class

函数的一部分

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

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

当您通过引用捕获它时 [&oCurrTime]
如果 oCurrTime 超出范围,您将得到 dangling reference.

一种解决方案可能是按价值捕获。