У меня есть следующая программа:
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 :
Как говорит исключение на изображении выше (исключение выдается в строке 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.