将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变量显示为未初始化。我很困惑因为我以为我已经通过添加&来处理它了。括号之间。
感谢您的帮助。
答案 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时执行"。
如果是这种情况,则意味着以alg
和config
作为参考的lambda将比这两个变量的范围更长。调用lambda并尝试访问引用时,它们会引用未引用的行为。