エラー/警告なしでアプリケーションがコンパイルされます。実行時に、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コンパイラでテストしました。
私はProcessOption関数が無限に繰り返されていると思いますが、back()に沿ってクラッシュしました。 – Unick