Почему выполнение iterator-> end () в непосредственном окне дает нарушение прав на чтение, даже когда итератор находится в области видимости - для C ++ vector :: iterator? - PullRequest
2 голосов
/ 07 января 2020

У меня есть следующая программа:

int main()
{
    vector<vector<int> > vv;
    vector<int> v1;
    vector<int> v2;
    v1.push_back(1);
    v1.push_back(2);
    v1.push_back(3);

    v2.push_back(10);
    v2.push_back(20);
    v2.push_back(30);
    vv.push_back(v1);
    vv.push_back(v2);

    for (vector<vector<int> >::iterator it = vv.begin(); it != vv.end(); it++)
    {
        for (vector<int>::iterator col = it->begin(); col != it->end(); col++)
        {
            cout << *col << " ";
        } //<------- when the instruction pointer is here, and I type it->end() in the immediate window, I get correct result in the immediate window, but then after doing an F10 or F11, I get a read access violation.
        cout << endl;
    }

    return 0;

}

Почему я получаю нарушение прав чтения, когда я только делаю it->end() в непосредственном окне (я просто читаю значение it->end() и это не должно давать мне нарушение прав чтения в данном конкретном случае)? Обратите внимание, что итератор it находится в области действия, и выполнение it->end() в ближайшем окне дает следующий правильный результат:

it->end()
{-33686019}
    [ptr]: 0x010ce02c {-33686019}
    [Raw View]: {...}

До этого момента все в порядке. Но затем, когда я выполняю F11 или F10 до go для следующей инструкции, я получаю нарушение прав чтения в файле - C: \ Program Files (x86) \ Microsoft Visual Studio \ 2019 \ Enterprise \ VC \ Tools \ MSVC \ 14.22.27905 \ include \ xmemory .

Ниже приведено исключение в файле xmemory : Read access violation in file xmemory

Как говорит исключение на изображении выше (исключение выдается в строке 1286 в файле xmemory ):

Exception thrown: read access violation.
_Pnext was 0xCCC35DE9.

Понятно, 0x CC означает _Pnext был неинициализирован. И, следовательно, выполнение *_Pnext в строке 1286 приводит к нарушению прав чтения.

Мой вопрос заключается в том, что я просто сделал it->end() в ближайшем окне, прежде чем просто выйти из того времени, пока l oop - как указано в моей программе main () выше. Итератор it находился в области действия в то время. И выполнение it->end() в непосредственном окне также дало мне правильный результат:

it->end()
{-33686019}
    [ptr]: 0x010ce02c {-33686019}
    [Raw View]: {...}

тогда, почему после этого выполнение F10 привело к нарушению прав чтения в строке 1286 в файле xmemory ?

Пожалуйста, смотрите : В программе main () я пометил закрывающую фигурную скобку - } - там, где встречается исключение. Указатель инструкций достигает этой закрывающей скобки, когда внутренний l oop выполняется полностью. При нажатии F10 или F11 после этого указатель инструкции переходит к следующему оператору - cout << endl; - если в непосредственном окне ничего не набрано. Кроме того, если я просто запускаю программу main () без отладки (то есть без отладки, как показано здесь), программа работает нормально, с правильным выводом. Также обратите внимание, что когда внутренняя l oop не выполняется полностью (то есть, когда закрывающая скобка - } - внутренней l oop не встречается), и я выполняю it->end() в непосредственном окне - я получаю правильный результат в непосредственном окне. И я могу идти вперед до самого конца, нажав F10 или F11. И основная () программа выводит правильный результат.

Сведения о компиляторе и ОС : Microsoft Visual Studio Enterprise 2019 (версия 16.2.1). Я собираю x86 Debug. 64-разрядная операционная система, 64-разрядный процессор. Windows edition = Windows 10 Pro.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...