在 65536 位置访问迭代器的指针运算符会导致段错误

Accessing pointer operator of iterator at 65536 position causes segfault

本文关键字:段错误 错误 运算符 位置 65536 访问 迭代器 指针      更新时间:2023-10-16

巧合的是,代码似乎在无符号短的最大值的确切数量上失败。

map<int,vector<string> > backofflist;
for (int k = backofflist.size(); k > 0; k--) // for ($i=$#backofflist;$i>0;$i--)
{
    vector<string>::iterator backofflist_iter;
    int i = 0;
    for (backofflist_iter=backofflist[k].begin();
        backofflist_iter!=backofflist[k].end();
        backofflist_iter++) // foreach $x (@($backofflist[$i]))
    {
        cout << i++ << endl;
        string x;
        try
        {
            x = *backofflist_iter; //foreach $x (@{$backofflist[$i]})
        }
        catch (exception &e)
        {
            cout << e.what() << endl;
            exit(1);
        }

生成以下输出:

...   
65532
65533
65534
65535
65536
{segfault}

我以为矢量有无限的容量?我错过了什么吗?我正在雪豹的XCode上编写这个程序。

此问题的唯一解决方案是在调用此代码之前将错误的std::vector插入到映射中,或以其他方式损坏了现有std::vector。代码的这一特定部分始终是明确定义的行为,如果backofflist没有填满您期望的键,则不一定是你期望的行为。

当然,缩进表明这不是您的整个循环,这可能是问题所在。

尝试注释此行

x = *backofflist_iter; //foreach $x (@{$backofflist[$i]})

重新编译,然后粘贴答案。如果您有其他段错误。打印完整的错误消息。