Lambda通过参考传递的功能

Lambda functions passing by reference

本文关键字:功能 参考 Lambda      更新时间:2023-10-16

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变量被显示为未初始化。我很困惑,因为我认为我已经通过添加&在支架之间。

谢谢您的帮助。

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

如果是这种情况,则意味着将algconfig作为参考的LAMBDA比这两个变量的范围都超过了范围。当调用Lambda并尝试访问其悬挂参考的参考文献并且您的行为不确定的那一刻。

PlaneAlg alg(renObj);

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

lambda功能传递给GUI类,然后在触发GUI时执行。

听起来很像您将lambda用作回调。我可以假设创建lambda的功能与以下内容相似吗?

是正确的吗?
gui.on_what_ever (configSetter);
// some code
return /*what ever*/;

如果是这样,则alg对象在此处脱离范围,该对象结束了其寿命。然后,任何对其的引用(或任何子对象)是无效的,不得使用,否则这会导致不确定的行为。

要解决此问题,只要Lambda可能使用它,您就需要确保alg对象保持活力。