1

私は自分のプログラムで次のようにベクトルを使用しています:

vector<vector<string> > values;
values[0].push_back("test words");

コードを実行すると、「セグメント違反」が表示されます

それから私はそれをgdbしようとしました、そして私はこれを得ました:

Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: KERN_INVALID_ADDRESS at address: 0x0000000000000008
0x00000001000035be in std::vector<std::string, std::allocator<std::string> >::push_back (this=0x0, __x=@0x7fff5fbff330) at stl_vector.h:602
602     if (this->_M_impl._M_finish != this->_M_impl._M_end_of_storage)

ここで何が起こっているのですか?

4

4 に答える 4

5

これは、ベクトルの空ベクトルを定義します。

vector<vector<string> > values; 

これは、文字列を最初のベクトルにプッシュします。

values[0].push_back("test words"); 

最初のベクトルはまだありません! 試す

vector<string> v;
values.push_back(v);
values[0].push_back("test words"); 

于 2012-06-15T10:33:24.553 に答える
4

には要素がありませんvalues。つまり、範囲外のアクセスが発生します。

values[0].push_back("test words");

push_back()に空にする必要がvector<string>ありますvalues

values.push_back(vector<string>());
values[0].push_back("test words");

valuesまたは、少なくとも 1 つのエントリで作成します (ベクター コンストラクターを参照)。

vector<vector<string> > values(1);
于 2012-06-15T10:33:47.877 に答える
0
values[0].push_back("test words");

ここでは、存在しないインデックス 0 にアクセスしようとしています。したがって、あなたは得ています

Program received signal EXC_BAD_ACCESS, Could not access memory.

簡単にするために、このようにすることができます。

vector<string> v;
vector<vector<string> > values;
v.push_back("test words");
values.push_back(v);
于 2012-06-15T10:40:55.100 に答える