繁体   English   中英

C ++ Lambda捕获搞乱局部变量值

[英]C++ Lambda capture messing up local variable value

我不确定这是VS 2010问题还是我完全误解了一些问题。 我正在通过lambda函数创建一个boost函数,该函数需要修改一个局部变量:

    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循环(其中评估某个特定时间的时间差)是无用的。

非常感谢您的帮助。

PS:上面的代码是类的函数的一部分

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

解决方案是通过值传递oCurrTime (如果可能的话,删除& ),或者在方法结束之前加入你的线程 - 如果可能的话。 您还可以使oCurrTime成为类变量。

当您通过引用[&oCurrTime]捕获它时
如果oCurrTime超出范围,您将有一个悬空参考

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM