[英]Lambda functions passing by reference
lambda函数传递给gui类,然后在gui触发时执行。 第一次运行算法时,一切都很好,然后当gui触发lambda时,应用程序将失败。
我有以下代码:
RenderObject* renObj = m_geometry[(size_t)ObjectType::plant];
PlaneAlg alg(renObj);
alg.run();
PlaneConfig& config = alg.getConfig();
auto configSetter = [&](double d) {
config.threshold = d;
alg.run();
};
QFrame* frame = gui.makeSpinLabel("Threshold: ", 0.1, config.threshold, configSetter);
一旦执行Lambda函数,config和alg变量就会显示为未初始化。 我很困惑,因为我认为自己已经在括号之间加上&来解决这个问题。
谢谢您的帮助。
PlaneAlg alg(renObj);
这是具有自动存储期限的对象。
lambda函数传递给gui类,然后在gui触发时执行。
这听起来很像您正在使用lambda作为回调。 我是否可以假设创建lambda的函数与以下内容类似?
gui.on_what_ever (configSetter);
// some code
return /*what ever*/;
如果是这样,那么alg
对象将超出范围,从而结束其生命周期。 因此,对它(或对任何子对象)的任何引用都是无效的,并且不得使用,否则将导致未定义的行为。
为了解决这个问题,您需要确保alg
对象保持活动状态,只要lambda一直在使用它即可。
您说“ lambda函数传递给gui类,然后在gui触发时执行 ”。
如果是这种情况,则意味着以alg
和config
为参考的lambda的alg
将超过这两个变量的范围。 在调用lambda并尝试访问引用时,它们悬空了引用,并且您具有未定义的行为。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.