#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. Большое вам спасибо! Я ввел неправильное значение для рекурсивного вызова…