繁体   English   中英

Lambda函数通过引用传递

[英]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触发时执行 ”。

如果是这种情况,则意味着以algconfig为参考的lambda的alg将超过这两个变量的范围。 在调用lambda并尝试访问引用时,它们悬空了引用,并且您具有未定义的行为。

暂无
暂无

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

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