0

偶然にも、コードはunsignedshortの最大値の正確な量で失敗するようです。

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}

ベクトルには無制限の容量があると思いましたか?足りないものはありますか?私はこのプログラムをSnowLeopardのXCodeで書いています。

4

2 に答える 2

3

この問題の唯一の解決策は、std::vectorこのコードが呼び出される前にマップに不正な を挿入するか、既存の を破損することstd::vectorです。backofflistコードのこの特定のセクションは、期待するキーでいっぱいでない場合に期待する動作とは限りませんが、常に明確に定義された動作です。

もちろん、インデントはこれがループ全体ではないことを示唆しており、そこに問題がある可能性があります。

于 2012-07-03T16:20:39.963 に答える
0

この行にコメントしてみてください

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

再コンパイルしてから、回答を貼り付けます。別のセグメンテーション違反がある場合。完全なエラー メッセージを出力します。

于 2012-07-03T16:32:51.960 に答える