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

时间:2012-07-03 15:53:17

标签: c++ macos stl osx-snow-leopard

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

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}

我认为矢量具有无限的容量?有什么我想念的吗?我正在Snow Leopard的XCode上编写这个程序。

2 个答案:

答案 0 :(得分:3)

此问题的唯一解决方案是在调用此代码之前将错误的std::vector插入到地图中,否则会损坏现有的std::vector。代码的这一特定部分始终是明确定义的行为,如果backofflist未满足您期望的密钥,则不一定是您期望的行为。

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

答案 1 :(得分:0)

尝试评论此行

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

重新编译,然后粘贴答案。如果你有另一个段错误。打印完整的错误消息。