list::back() вызывает переполнение стека

#c #c 11 #stl

#c #c 11 #stl

Вопрос:

Мое приложение компилируется без каких-либо ошибок / предупреждений. Во время выполнения я получаю странное переполнение стека при вызове функции list::back() (@std::_Iterator_base12::_Orphan_me() Строка 193).

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

            intamp; 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;
            }

            intamp; 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.

Комментарии:

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

Ответ №1:

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

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

Комментарии:

1. Большое вам спасибо! Я ввел неправильное значение для рекурсивного вызова…