1. ホーム
  2. C++

ベクター使用時、ベクター添え字が範囲外、その他類似のエラーが発生する。

2022-02-20 21:32:59

今日、デバッグでvector subscript out of rangeというエラーが出たので調べてみました。

このエラーを報告すると、次のようなウィンドウがポップアップ表示されます。

ベクターがベクターのサイズ以上のデータを保持しているため、メモリのオーバーフローが発生しているようです。
解決方法は以下の通りです。

Vector<string> conの後、直接渡すことができない。

vector[0] = "aa"

vector[1] = "bb" などと代入すると、out-of-bounds になってしまいます。(添え字は変更であり、挿入ではありません。添え字を使いたい場合は、初期化時に十分な要素があることを確認する必要があり、通常はpush_back()で行います)

まずtagSeq.resize(n)ステートメントを使って、ベクトルの大きさを初期の長さに調整し、その後、上記の方法で値を代入します。重要なのは、resize()関数の助けを借りて、コンテナの初期長を設定することを覚えることです。

また、Vector<string>ベクターの後にベクターのpush_back("aa")メソッドを呼び出してデータを追加すると、自動的にメモリ要求されるので、枠外に出ずにベクターのサイズを段階的に大きくしていくこともできます。

コンテナを利用する場合、ある条件を満たすと判断してpush_back()関数経由でコンテナに要素を追加するものが多いが、最終的にその条件を満たさない、つまりコンテナに要素が追加されない場合があるので、v[n-1]などの添え字でアクセスしたりv.back()、v. front() などの特定の関数でアクセスすると out-of-bounds subcript error (memory overflow) になってしまう

vには要素が全く格納されていないので、vの長さやv.size()は0になり、v[n-1]やv.front()などは意味がないため、見逃しやすいエラーが発生することになります。上記の添え字アクセスやコンテナなど、どうしても使いたい関数がある場合は、if条件 if (!v.empty()) を追加する、つまりvが空でない場合にのみ上記のアクセス操作が可能になるようにすればよい。