나는이 세그 폴트를 알아 내기 위해 머리카락을 뽑아 내고 도움을 요청하기로 결정했다.
나는 (string, string, double)
을 포함하는 boost::multi_index
컨테이너가 있으며 어느 시점에서 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
은 컨테이너 자체의 범위를 넘기 때문에 발생할 수있는 일이지만 어떻게 될지 이해하지 못하기 때문에 이런 일이 발생합니다.
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++
을 추가하려했지만 도움이되지 않았습니다.
아무도 내게 어떤 단서를 주겠습니까?
감사합니다.