2012-03-11 155 views
0

我一直拔出我的头发来找出这段错误,并决定要求一些帮助。
我有一个boost::multi_index容器,其中包含(string, string, double),它在某个点上遇到段错误。SIGSEGV在探索提升:: 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高于容器本身的范围,但不明白它可能如何发生。

GDB显示错误消息:

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 ... 

,当我打电话it->str1()在while条件,不能因为标记向量的它显然崩溃。我怎样才能防止这一点? 我试图在*it++的正下方添加if(it == myContainer.get<str1>().end()) break;,但没有帮助。
有人会给我一些线索吗?
谢谢!

回答

0

有许多与你的代码的问题:

  • ,如果有在容器等同于token[i]没有元素,它会崩溃,从此find回报end(),这是不提领。
  • 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()为空或token[i]为空。

确保它们不为空,并且分段错误将消失。

您可能希望与if更换while,也注意,如果发现是算法从here发现,如果该项目没有找到返回的迭代器作为最后一个元素的迭代器,这可能str1为空值。

你是否确定要遍历每个字符的标记字符串,并打印每个标记字符的每个匹配项,而不仅仅为整个标记字符串打印一个匹配项?(至少我认为它是一个字符串,因为你的示例代码没有定义它)。