SIGSEGV在探索boost :: multi_index时

时间:2012-03-11 03:38:31

标签: c++ debugging segmentation-fault boost-multi-index

我一直拔出头发来弄清楚这个段落,并决定寻求帮助 我有一个boost::multi_index容器,其中包含(string, string, double),并且在某些时候会遇到段错误。

以下是我的代码的简化版本:

#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()时,它显然会崩溃,而不是因为令牌向量。我怎么能阻止这个? 我尝试在if(it == myContainer.get<str1>().end()) break;下面添加*it++,但没有帮助 有人能给我一些线索吗? 谢谢!

2 个答案:

答案 0 :(得分:0)

it->str1()为空或token[i]为空。

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

您可能希望将while替换为if,同时请注意,如果find是从here找到的算法,如果找不到该项,则返回迭代器作为最后一个元素的迭代器,可能str1为null。

您是否确定要逐字符对令牌字符串进行迭代并按每个令牌字符打印每个匹配而不是仅为整个令牌字符串打印一个匹配?(至少我认为它是一个字符串,作为您的示例代码没有定义它)。

答案 1 :(得分: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); }

我建议您更改代码如下:

{{1}}