私はこのセグメンテーションを理解するために私の髪を抜いていて、助けを求めることにしました。
私はboost::multi_index
コンテナを持っています。これには(string, string, double)
が含まれていて、ある時点でsegfaultにヒットします。SIGSEGV boost :: multi_index
ここに私のコードの簡易版です。
#include<iostream>
....
// mySet is a multi_index container which contains <(string str1), (string str2), (double val)>
typedef mySet::index<str1>::type set_by_str1;
...
for(unsigned int i=0; i < token.size(); ++i)
{
set_by_str1::iteration it = myContainer.get<str1>().find(token[i]);
while(it->str1() == token[i])
{
cout << it->str1() << ", " << it->str2() << ", " << it->val << endl;
}
*it++;
}
は、このコードはかなりうまく働いているようだが、それはいくつかの特定のトークンに当たった場合にのみ、それがクラッシュし、これは満たしていない場合(逆に言えば、それがクラッシュすることはありません。トークン)。
これは、it
がコンテナ自体の範囲を上回っているが、起こり得る可能性を理解していないために起こると思います。
Program received signal SIGSEGV, Segmentation fault.
0x08052e83 in std::string::size (this=0x806e190) at /usr/include/c++/4.4/bits/basic_string.h:629
629 { return _M_rep()->_M_length; }
(gdb) bactrace full
#0 0x08052e83 in std::string::size (this=0x806e190) at /usr/include/c++/4.4/bits/basic_string.h:629
No locals.
#1 0x08050475 in std::operator<< <char, std::char_traits<char>, std::allocator<char> > (__os=..., __str=...)
at /usr/include/c++/4.4/bits/basic_string.h:2503
No locals.
#2 0x0804e4e0 in MyClass:MyFunction (this=0xbffff534) at src/MyCode.cpp:353 (This is where while condition exists)
... dump of HUGE trace for multi_index ...
と私はwhile条件でit->str1()
を呼び出すとき、それは明らかではないため、トークンベクトルの、クラッシュ:
GDBのエラーメッセージが表示されます。どうすればこれを防ぐことができますか? if(it == myContainer.get<str1>().end()) break;
のすぐ下に*it++
を追加しようとしましたが、助けになりませんでした。
誰かが私に手がかりを与えますか?
ありがとうございます!