Lambda函数通过引用传递

时间:2017-03-12 20:31:55

标签: c++ lambda

将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变量显示为未初始化。我很困惑因为我以为我已经通过添加&来处理它了。括号之间。

感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

PlaneAlg alg(renObj);

这是一个具有自动存储持续时间的对象。

  

将lambda函数传递给gui类,然后在触发gui时执行。

这听起来很像你使用lambda作为回调。我是否正确地假设创建lambda的函数类似于以下内容?

gui.on_what_ever (configSetter);
// some code
return /*what ever*/;

如果是,则alg对象超出范围,结束其生命周期。对它(或任何子对象)的任何引用都是无效的,不得使用,否则会导致未定义的行为。

要解决此问题,只要lambda可能正在使用它,就需要确保alg对象保持活动状态。

答案 1 :(得分:2)

你说" 将lambda函数传递给gui类,然后在触发gui时执行"。

如果是这种情况,则意味着以algconfig作为参考的lambda将比这两个变量的范围更长。调用lambda并尝试访问引用时,它们会引用未引用的行为。