1

I have trouble with using code similar to the following one:

std::map<boost::tuple<int, int, int>, int> m;
boost::tuple<int, int, int> key = boost::make_tuple(1,2,3);
m.find(key);

The compiler does not see any errors. But when I start my program a weird Segmentation fault occurs. So I wanted to find the code line which causes it. GDB then told me:

Program received signal SIGSEGV, Segmentation fault.
0x0809f40a in boost::tuples::detail::lt<boost::tuples::cons<int,
boost::tuples::cons<int, boost::tuples::cons<int, boost::tuples::null_type> > >, 
boost::tuples::cons<int, boost::tuples::cons<int, boost::tuples::cons<int, 
boost::tuples::null_type> > > > (lhs=..., rhs=...)
at /usr/local/lib/boost_1_45_0/boost/tuple/tuple_comparison.hpp:73
73             lt(lhs.get_tail(), rhs.get_tail()));

Unfortunately I could not find any solutions to this kind of problem so far.

Does anybody see what I missed here?

EDIT: So I did some further investigation. The Object which causes the problem is a user-defined one. And actually neither the boost-stuff nor the usage of the map seems to be the reason because the error also occurs with vectors!

class A {
void foo();
private:
    std::vector<int> v;
}
void A::foo() {
    ...
    v = std::vector<int>(); // Here already comes a segfault.
    ...
}

I also tried to reproduce the error in a seperate class. Unfortunately I wasn't able to provoke the error in there.

Now the gdb tells me:

Program received signal SIGSEGV, Segmentation fault.
0x010cae21 in free () from /lib/libc.so.6
(gdb) backtrace 
#0  0x010cae21 in free () from /lib/libc.so.6
#1  0x00fd7441 in operator delete(void*) () from /usr/lib/libstdc++.so.6
#2  0x080668c7 in __gnu_cxx::new_allocator<int>::deallocate (this=0xbfffdb04, 
__p=0x210bf) at /usr/include/c++/4.4/ext/new_allocator.h:95
#3  0x08064b8d in std::_Vector_base<int, std::allocator<int> >::_M_deallocate 
(this=0xbfffdb04, __p=0x210bf, __n=105047440)
at /usr/include/c++/4.4/bits/stl_vector.h:146
#4  0x0806246a in std::_Vector_base<int, std::allocator<int> >::~_Vector_base
(this=0xbfffdb04, __in_chrg=<value optimized out>)
at /usr/include/c++/4.4/bits/stl_vector.h:132
#5  0x080604d4 in std::vector<int, std::allocator<int> >::~vector (this=0xbfffdb04,  
__in_chrg=<value optimized out>)
at /usr/include/c++/4.4/bits/stl_vector.h:313
#6  0x0809e151 in ModelManager::emitSignal (this=0xbffff20f, o=crossroad, r=none, 
restrID=-1, signal=add, id=-5, colStart=-1, colEnd=-1)
at .build_debug/src/model/modelmanager.cpp:103

Could it be caused by the compiler settings?

Bastian
  • 4,638
  • 6
  • 36
  • 55

2 Answers2

3
#include <map>
#include <iostream>
#include <boost/tuple/tuple.hpp>
#include <boost/tuple/tuple_comparison.hpp>

int main()
{
    typedef boost::tuple<int, int, int> TTuple3;
    typedef std::map<TTuple3, int> TTupleMap;
    TTupleMap m;
    TTuple3 key1 = boost::make_tuple(1,2,3);
    TTuple3 key2 = boost::make_tuple(1,2,4);
    m[key1] = 1;
    m[key2] = 2;
    TTupleMap::iterator it = m.find(key1);
    if (it == m.end())
        std::cout << "not found" << std::endl;
    else
        std::cout << "found" << std::endl;

    std::cout << m[key1] << std::endl;
    std::cout << m[key2] << std::endl;

    return 0;
}

this produce for me:

found
1
2

Nothing wrong here.

  • I agree - I also could not reproduce the error in a simple class. Maybe it's due to the usage of different compiler settings? I'm using the coming C++0x-standard and the gcc. Therefore I had to activate this feature. – Bastian Dec 22 '10 at 16:58
  • Run your program under valgrind. I think it will show up some invalid write or invalid read command. – Industrial-antidepressant Dec 23 '10 at 01:38
  • Yeah, I already did that and indeed found some issues. There are many possible memory leaks which are somehow Qt-related. Also the following message occured: Address 0x4f4e5e0 is not stack'd, malloc'd or (recently) free'd. As I'm not familiar with valgrind nor with this kind of debugging in general, this will keep me busy for some time I fear... – Bastian Dec 23 '10 at 12:22
0

The behavior you're describing indicates you've corrupted your heap or stack. I'd suggest recompiling with options -Wall -Wextra, fix any warnings you encounter and then see if you still run into the crash. I'd pay close attention to functions declared non-void that don't return a value. g++ doesn't warn by default for this and will almost always cause a crash away from where the error actually is. -Wextra will turn that warning on.

Nathan Ernst
  • 4,540
  • 25
  • 38
  • I already used these options to eliminate all such code segments. But funnily the boost-graph-library (particularly) and the cml-library (used for vector-maths) caused a nice bunch of warnings which are mostly related to the usage of /usr/include/c++/4.4/backward/hash_set. – Bastian Dec 22 '10 at 22:37