std::map segfaults при използване на оператор []

Имам странен проблем. Използвам фабричен шаблон за регистрация, който се отнася вътрешно към std::map. Използвам този подход за множество компоненти и регистрацията се случва в множество точки в различни единици на компилация (известни още като .cpp файлове). Това се случва по време на инициализация на статични променливи (преди да бъде извикан 'main'). По някаква странна причина получавам segfault, когато имам предвид

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

person Emanuele    schedule 07.03.2011    source източник
comment
Само едно странно предположение. Възможно ли е това да е причината? : parashift.com/c++-faq-lite/ctors.html #faq-10.14   -  person Naveen    schedule 07.03.2011


Отговори (1)


Може да се натъкнете на проблема със статичната инициализация:

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

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

person Nick    schedule 07.03.2011