2012-03-11 4 views
0

私はこのセグメンテーションを理解するために私の髪を抜いていて、助けを求めることにしました。
私は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++を追加しようとしましたが、助けになりませんでした。
誰かが私に手がかりを与えますか?
ありがとうございます!

答えて

0

あなたのコードで多くの問題があります。

  • token[i]にコンテナ換算でどの要素がありません場合には、クラッシュしますfindそれ以来戻っend()、dereferenceableではありません。
  • whileループitの間にコンテナの終わりに達することができます。また、それを尊重することはできません。
  • findは、token[i]に相当するキーを持つ最初の要素を取得しません。これはおそらくあなたが望むものです。代わりにlower_boundを使用してください。

私は次のようにコードを変更勧め:

pair<set_by_str1::iterator, set_by_str1::iterator> p = 
    myContainer.get<str1>().equal_range(token[i]); 

while(p.first!=p.second) 
{ 
    cout << p.first->str1() << ", " << p.first->str2() << ", " 
     << p.first->val << endl; 
    ++(p.first); 
} 
0

it->str1()がnullまたはtoken[i]がnullです。

これらがヌルでないことと、セグメンテーションフォールトがなくなることを確認してください。

ます。また、検索がアルゴリズムがhereから発見された場合にアイテムが見つからない場合、それはstr1などを有していてもよい、最後の要素のイテレータとしてイテレータを返すことに注意して、ifwhileを交換したい場合がありますヌル。

トークン文字列を文字単位で反復処理し、トークン文字列全体に対して1つの一致を出力するのではなく、各トークン文字を1文字ずつ出力することも確かですか(少なくとも、文字列であると思うサンプルコードでは定義していません)。

関連する問題