У меня странная проблема. Я использую шаблон заводской регистрации, который внутренне ссылается на std :: map. Я использую этот подход для нескольких компонентов, и регистрация происходит в нескольких точках в разных единицах компиляции (также называемых файлами .cpp). Это происходит во время инициализации статических переменных (до вызова main). По какой-то странной причине у меня возникает ошибка сегментации, когда я говорю о
map[key] = value;
(в основном, когда я регистрирую конкретный pfn). Теперь, если я перенесу регистрации для этих проблемных компонентов в один и тот же модуль компиляции, все заработает. Опять же, если я возвращаю регистрацию только одного компонента, я получаю ошибку segfault.
Я должен сказать, что это не первый раз, когда я использую этот шаблон, и он работает для одного и того же исполняемого файла для других компонентов (то есть компоненты, распределенные по нескольким .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