Сегменты ошибок std :: map при использовании оператора [] - PullRequest
3 голосов
/ 07 марта 2011

У меня странная проблема.Я использую шаблон регистрации фабрики, который внутренне ссылается на std :: map.Я использую этот подход для нескольких компонентов, и регистрация происходит в нескольких точках в разных единицах компиляции (или .cpp файлы).Это происходит во время инициализации статических переменных (до вызова 'main').По какой-то странной причине я получаю segfault, когда имею в виду

map[key] = value;

(в основном, когда я регистрирую конкретный pfn).Теперь, если я перенесу регистрации для определенных проблемных компонентов в один и тот же модуль компиляции, все работает.Опять же, если я вернусь назад к регистрации только одного компонента, у меня возникнет ошибка.

Я должен сказать, что я не первый раз использую этот шаблон, и он работает для того же исполняемого файла для других компонентов (т.е. компоненты, распределенные по нескольким .cpp для другого типа фабрики, регистрируются во время инициализации без проблем, используя в основном схожий исходный код).

что мне делать?На данный момент я оставил регистрацию компонентов в том же .cpp (и она работает без нареканий).Как мне лучше исследовать?

Я использую g ++ (Ubuntu / Linaro 4.4.4-14ubuntu5) 4.4.5

Ниже трассировки стека

0x00007ffff793da1a in std::_Rb_tree_decrement(std::_Rb_tree_node_base*) () from /usr/lib/libstdc++.so.6
(gdb) bt
#0  0x00007ffff793da1a in std::_Rb_tree_decrement(std::_Rb_tree_node_base*) () from /usr/lib/libstdc++.so.6
#1  0x0000000000413fe9 in std::_Rb_tree_iterator, std::allocator > const, http::servlet* (*)()> >::operator-- (
    this=0x7fffffffdff0) at /usr/include/c++/4.4/bits/stl_tree.h:199
#2  0x000000000041379d in std::_Rb_tree, std::allocator >, std::pair, std::allocator > const, http::servlet* (*)()>, std::_Select1st, std::allocator > const, http::servlet* (*)()> >, std::less, std::allocator > >, std::allocator, std::allocator > const, http::servlet* (*)()> > >::_M_insert_unique (this=0x632a20, __v=...) at /usr/include/c++/4.4/bits/stl_tree.h:1179
#3  0x00000000004125f2 in std::_Rb_tree, std::allocator >, std::pair, std::allocator > const, http::servlet* (*)()>, std::_Select1st, std::allocator > const, http::servlet* (*)()> >, std::less, std::allocator > >, std::allocator, std::allocator > const, http::servlet* (*)()> > >::_M_insert_unique_ (this=0x632a20, __position=..., __v=...) at /usr/include/c++/4.4/bits/stl_tree.h:1217
#4  0x00000000004116c4 in std::map, std::allocator >, http::servlet* (*)(), std::less, std::allocator > >, std::allocator, std::allocator > const, http::servlet* (*)()> > >::insert (
    this=0x632a20, __position=..., __x=...) at /usr/include/c++/4.4/bits/stl_map.h:540
#5  0x0000000000410a63 in std::map, std::allocator >, http::servlet* (*)(), std::less, std::allocator > >, std::allocator, std::allocator > const, http::servlet* (*)()> > >::operator[] (
    this=0x632a20, __k=...) at /usr/include/c++/4.4/bits/stl_map.h:450
#6  0x000000000040e3b1 in http::servlet::add_creator (type=0x4234d0 "/gpu/european_opt_xyz", func=0x421567 )
    at ./src/http.cpp:336

1 Ответ

8 голосов
/ 07 марта 2011

Вы можете столкнуться с проблемой статической инициализации:

https://isocpp.org/wiki/faq/ctors#static-init-order

Как вы инициализируете карту?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...