首页 > 解决方案 > 为什么在即时窗口中执行 iterator->end() 会导致读取访问冲突,即使迭代器在范围内 - 对于 C++ vector::iterator?

问题描述

我有以下程序:

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 以转到下一条指令时,我在文件中遇到读取访问冲突 - C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Tools\MSVC \14.22.27905\include\ xmemory

以下是文件xmemory中的异常: 文件 xmemory 中的读取访问冲突

正如上图中的异常所说(异常在文件xmemory的第 1286 行引发):

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

显然,0xCC 表示_Pnext未初始化。因此,*_Pnext在第 1286 行执行会导致读取访问冲突。

我的问题是,it->end()在退出 while 循环之前,我只是在即时窗口中完成了一个操作 - 如上面的 main() 程序所示。并且,迭代器it当时在范围内。it->end()在即时窗口中执行也给了我正确的结果:

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

那么,为什么在那之后执行 F10 会导致文件xmemory中第 1286 行的读取访问冲突?

请参阅:在 main() 程序中,我已经标记了右大括号 - } - 遇到异常的地方。当内部循环完全执行时,指令指针到达这个右括号。之后按 F10 或 F11,指令指针转到下一条语句cout << endl;- 如果在立即窗口中没有键入任何内容。此外,如果我只运行 main() 程序而不进行调试(也就是说,没有按照我在这里展示的方式进行调试),程序执行得很好,输出正确。另请注意,当内循环没有完全执行时(即当没有遇到内循环的右大括号 - } - 时),我执行it->end()在即时窗口中 - 我在即时窗口中得到正确的结果。而且,我可以按 F10 或 F11 一直前进到最后。main() 程序输出正确的结果。

编译器和操作系统详细信息:Microsoft Visual Studio Enterprise 2019(版本 16.2.1)。我正在构建 x86 调试。64 位操作系统,基于 x64 的处理器。Windows 版本 = Windows 10 专业版。

标签: c++iteratorrandom-access

解决方案


推荐阅读