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

时间:2016-04-15 07:49:31

标签: c++ variables lambda local capture

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

非常感谢您的帮助。

P.S。:上面的代码是类

的一部分

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:0)

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

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