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.
一种解决方案可能是按价值捕获。
我不确定这是 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.
一种解决方案可能是按价值捕获。