2016-10-11 2 views
-1

Мое приложение компилируется без каких-либо ошибок/предупреждений. Во время выполнения я получаю странное переполнение стека при вызове функции list :: back() (@std :: _ Iterator_base12 :: _ Orphan_me() строка 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); 
      } 
     } 
    } 
}; 

Отладчик подтверждает, что оба списка, включая один (действительный) элемент при вызове функции. Я тестировал его с помощью современных компиляторов MSVC++ 2013 и 2015.

+3

Я думаю, что у вас есть бесконечная рекурсия функции ProcessOption, но она разбилась в строке с back(). – Unick

ответ

4

Точная линия, в которой вы получаете ошибку, не является основной причиной. Основная проблема заключается в том, что ProcessOption() продолжает звонить, пока не закончится пространство стека.

Чтобы подтвердить это, используйте ваш отладчик, чтобы проверить стек вызовов в момент сбоя.

+0

Арг, большое спасибо! Я искал неправильное значение для рекурсивного вызова ... – siskat

Смежные вопросы