Ошибки сегментации с boost :: tuple и std :: map - PullRequest
1 голос
/ 22 декабря 2010

У меня проблемы с использованием кода, подобного следующему:

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

Компилятор не видит ошибок.Но когда я запускаю свою программу, возникает странная ошибка сегментации.Поэтому я хотел найти строку кода, которая его вызывает.Затем GDB сказал мне:

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()));

К сожалению, я пока не смог найти решения этой проблемы.

Кто-нибудь видит, что я здесь пропустил?

РЕДАКТИРОВАТЬЯ провел дополнительное расследование.Объект, который вызывает проблему, определяется пользователем.И на самом деле ни повышение, ни использование карты, кажется, не является причиной, потому что ошибка также происходит с векторами!

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

Я также пытался воспроизвести ошибку в отдельном классе.К сожалению, я не смог спровоцировать ошибку там.

Теперь GDB говорит мне:

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

Может ли это быть вызвано настройками компилятора?

Ответы [ 2 ]

3 голосов
/ 22 декабря 2010
#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;
}

этот продукт для меня:

found
1
2

Ничего плохого в этом нет.

0 голосов
/ 22 декабря 2010

Поведение, которое вы описываете, указывает на то, что вы испортили свою кучу или стек. Я бы посоветовал перекомпилировать с параметрами -Wall -Wextra, исправить все предупреждения, с которыми вы столкнулись, и посмотреть, столкнетесь ли вы с ошибкой. Я бы обратил пристальное внимание на функции, объявленные не void, которые не возвращают значение. G ++ не предупреждает об этом по умолчанию и почти всегда вызывает сбой, где ошибка на самом деле. -Wextra включит это предупреждение.

...