Исключение C ++ "deque itererencable" итератор deque выдается в режиме отладки - PullRequest
0 голосов
/ 04 февраля 2020

При выполнении кода в режиме отладки я получаю сообщение об ошибке «Итератор deque не может быть разыменован». Код ниже -

#include "stdafx.h"
#include <string>
#include <iostream>
#include <queue> 

using namespace std;

int main()
{
    queue<int> myqueue;

    for (int i = 0; i < 1000; i++)
    {
        myqueue.push(i);
        myqueue.front();

        cout << "myqueue.front() is = " << myqueue.front() << endl;

        myqueue.pop();
    }

    cout << "myqueue.front() is now = " << myqueue.front() << endl;   /// Getting error here

    getchar();
    return 0;
}

, когда я ставлю проверку размера очереди перед доступом к myqueue.front (), тогда он не получает cra sh, как код, измененный ниже -

if (myqueue.size() > 0)
    cout << "myqueue.front() is now = " << myqueue.front() << endl;

Код отлично работает в режиме Release без проверки (myqueue.size ()> 0), однако он получает cra sh во время выполнения только в режиме отладки.

Может Кто-нибудь, помогите мне сообщить, почему он получает cra sh только в режиме отладки. и как избавиться от ошибки в режиме отладки.

1 Ответ

1 голос
/ 04 февраля 2020

Вы касаетесь неопределенного поведения здесь, потому что вы получаете доступ к переднему элементу, даже если ваш std::queue<int> пуст. Вот почему следующее утверждение:

std::cout << "myqueue.front() is now = " << myqueue.front() << std::endl;

может иногда давать вам случайное значение (одно из значений, которое содержалось в вашем std::queue<int> ранее) или вызывать cra * sh (что происходит в вашем случае) - Неопределенное поведение.

Вот почему всегда полезно проверить, есть ли у std::queue какие-либо элементы, прежде чем пытаться получить к ним доступ:

if (!myqueue.empty()) {
    std::cout << "myqueue.front() is now = " << myqueue.front() << std::endl;
}
...