ベクター使用時、ベクター添え字が範囲外、その他類似のエラーが発生する。
今日、デバッグで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が空でない場合にのみ上記のアクセス操作が可能になるようにすればよい。
関連
-
の 0x091f11c7 での未処理例外について。0xC0000005: アクセス違反の読み取り位置 0x0ab0f
-
解決策:エラー:'cout'は型名ではありません。
-
34:5: エラー: 制御が非ボイド関数の終わりに達する可能性がある [-Werror,-Wreturn-type] エラー解析
-
ソースファイルをコンパイルするとDev C++のランタイムエラーが発生し、コンパイルできない
-
不完全なクラス型へのポインタが許可されていないのですが、どのようなエラーですか?
-
C++: エラー C2228: '.str' の左側にはクラス/構造体/結合が必要
-
警告: この関数では 'p' が初期化されていない状態で使用されることがあります。
-
[C++] 不完全な型へのメンバーアクセスエラー
-
C++ Error no matching function for call to 'std::basic_ofstream<char>::basic_ofstream(std::string&)
-
EclipseのC++コードでシンボル'std'が解決できない問題の解決
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン