SIGSEGV在探索提升:: multi_index
问题描述:
我一直拔出我的头发来找出这段错误,并决定要求一些帮助。
我有一个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;
,但没有帮助。
有人会给我一些线索吗?
谢谢!
答
有许多与你的代码的问题:
- ,如果有在容器等同于
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);
}
答
it->str1()
为空或token[i]
为空。
确保它们不为空,并且分段错误将消失。
您可能希望与if
更换while
,也注意,如果发现是算法从here发现,如果该项目没有找到返回的迭代器作为最后一个元素的迭代器,这可能str1
为空值。
你是否确定要遍历每个字符的标记字符串,并打印每个标记字符的每个匹配项,而不仅仅为整个标记字符串打印一个匹配项?(至少我认为它是一个字符串,因为你的示例代码没有定义它)。