2016-10-11 10 views
-1

エラー/警告なしでアプリケーションがコンパイルされます。実行時に、list :: back()関数(@std :: _ Iterator_base12 :: _ Orphan_me()Line 193)を呼び出すと、奇妙なスタックオーバーフローが発生します。list :: back()によってスタックオーバーフローが発生する

class Stock 
{ 
public: 
    bool falling = false; 
    list<int> peaks; 
    list<int> bottoms; 

    void ProcessOption(int value) 
    { 
     if (falling) 
     { 
      if (bottoms.empty()) { 
       bottoms.push_back(value); 
       return; 
      } 

      int& lastValue = bottoms.back(); //<- Error 
      if (value < lastValue) { 
       bottoms.pop_back(); 
       bottoms.push_back(value); 
      } 
      else if (value > lastValue) { 
       falling = false; 
       ProcessOption(value); 
      } 
     } 
     else 
     { 
      if (peaks.empty()) { 
       peaks.push_back(value); 
       return; 
      } 

      int& lastValue = peaks.back(); //<- Error 
      if (value > lastValue) { 
       peaks.pop_back(); 
       peaks.push_back(value); 
      } 
      else if (value < lastValue) { 
       falling = true; 
       ProcessOption(value); 
      } 
     } 
    } 
}; 

デバッガは、両方のリストが機能を呼び出すときに1つの(有効な)要素を含むことを確認します。私はそれを最新のMSVC++ 2013および2015コンパイラでテストしました。

+3

私はProcessOption関数が無限に繰り返されていると思いますが、back()に沿ってクラッシュしました。 – Unick

答えて

4

エラーが発生する正確な行は根本的な原因ではありません。基本的な問題は、ProcessOption()がスタック領域を使い果たすまで自分自身を呼び出し続けることです。

これを確認するには、デバッガを使用して、クラッシュ時のコールスタックを調べます。

+0

ああ、ありがとう!私は再帰呼び出しに間違った価値をもたらしました... – siskat

関連する問題