2017-03-12 12 views
-1

ラムダ関数はguiクラスに渡され、guiがトリガされたときに実行されます。アルゴリズムを実行すると、最初はすべて良好で、GUIがラムダをトリガするとアプリケーションは失敗します。参照渡しのラムダ関数

私は、次のコードを持っている:ラムダ関数が実行され、これまで設定し、ALG変数が初期化されていないように示されている場合は

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); 

を。大括弧の間に&を追加して世話をしたと思ったので、私は非常に混乱しています。

ありがとうございました。

+3

あなたのコードはラムダを呼び出さないのですか? ... – WhiZTiM

+0

[MCVE]を投稿してください。 –

+0

@WhiZTiMです。私はちょっとコードを小さくしようとしているので、その部分を置いていません。それがあなたを助けたら私は追加します。 – Illia

答えて

2

あなたは "と言っています。ラムダ関数はguiクラスに渡され、guiがトリガーされたときに実行されます"。

この場合、参考としてalgconfigをとるラムダは、これら2つの変数の有効期間よりも長くなることを意味します。ラムダが呼び出されて参照にアクセスしようとすると、参照がありません。未定義の動作があります。

+0

これはありがとうございました。 – Illia

3
PlaneAlg alg(renObj); 

これは自動保存期間を持つオブジェクトです。

ラムダ関数はguiクラスに渡され、guiがトリガされたときに実行されます。

ラムダをコールバックとして使用しているような音です。ラムダを作成する関数が次のようになると仮定するのは正しいですか?

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

そうなら、algオブジェクトは、その存続期間を終了しており、ここではスコープの外に起こっています。それへの参照(または任意のサブオブジェクト)は無効であり、使用されてはなりません。そうでないと、未定義の動作につながります。

これを解決するには、ラムダが使用している限り、algオブジェクトが生きていることを確認する必要があります。

+0

ありがとうございました。それはまさに問題でした。 – Illia

+0

あなたも同様ですが、Gill Batesが最初です。ダニエルにもう一度感謝します。 – Illia

+0

問題はありません、私はあなたを助けることができてうれしいです:) –

関連する問題