C++ std::使用运算符[]时映射SEGFULTS

C++ std::使用运算符[]时映射SEGFULTS,c++,initialization,segmentation-fault,factory,stdmap,C++,Initialization,Segmentation Fault,Factory,Stdmap,我有一个奇怪的问题。 我使用的是工厂注册模式,它在内部引用std::map。 我对多个组件使用这种方法,注册在不同编译单元(aka.cpp文件)的多个点进行。这发生在静态变量初始化时(在调用“main”之前)。 由于某种奇怪的原因,当我提到 映射[键]=值; (基本上是在我注册特定pfn时)。 现在,如果我在同一个编译单元中移动特定麻烦组件的注册,一切都会正常工作。 同样,如果我将一个组件的注册向后移动,我会得到一个segfault 我必须说,这不是我第一次使用这种模式,它适用于其他组件的相

我有一个奇怪的问题。 我使用的是工厂注册模式,它在内部引用std::map。 我对多个组件使用这种方法,注册在不同编译单元(aka.cpp文件)的多个点进行。这发生在静态变量初始化时(在调用“main”之前)。 由于某种奇怪的原因,当我提到


映射[键]=值;

(基本上是在我注册特定pfn时)。 现在,如果我在同一个编译单元中移动特定麻烦组件的注册,一切都会正常工作。 同样,如果我将一个组件的注册向后移动,我会得到一个segfault

我必须说,这不是我第一次使用这种模式,它适用于其他组件的相同可执行文件(即,跨多个.cpp的另一工厂类型的组件在初始化时注册,没有问题,使用基本相似的源代码)

我该怎么办? 现在,我将组件的注册保留在同一个.cpp中(它工作得非常完美)。 我怎样才能更好地调查

我使用的是g++(Ubuntu/Linaro4.4.4-14ubuntu5)4.4.5

在stacktrace下面

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 0x00007FF793DA1A位于/usr/lib/libstdc++.so.6中的std:_Rb_tree_减量(std:_Rb_tree_node_base*)() (gdb)英国电信 #0 0x00007FF793DA1A位于/usr/lib/libstdc++.so的std:_Rb_tree_减量(std:_Rb_tree_node_base*)()中 #std::_Rb_tree_迭代器,std::allocator>const,http::servlet*(*)()>::操作符--( 在/usr/include/c++/4.4/bits/stl_-tree.h:199处,该值为0x7ffffffffffff0) #std中的2 0x000000000041379d::_Rb_树,std::分配器>,std::pair,std::分配器>常量,http::servlet*(*)()>,std:_Select1st,std::分配器>常量,http::servlet*(*)()>,std::less,std::分配器>,std::分配器,std::分配器>常量,http::servlet*(*)()>::_M_insert_unique(此=0x632a20,u v=…)at/usr/include/c++/4.4/bits/stl_tree.h:1179 #3 0x00000000004125f2在std::_Rb_树,std::allocator>,std::pair,std::allocator>const,http::servlet*(*)()>,std:_Select1st,std::allocator>const,std::less,std::allocator>,std::allocator>const,http::servlet*(*)()>>::_M\u insert\u unique(this=0x632a20,)位置=…,(v=…)at/usr/include/c++/4.4/bits/stl_tree.h:1217 #std::map、std::allocator>、http::servlet*(*)()、std::less、std::allocator>>、std::allocator、std::allocator>常量、http::servlet*(*)()>>:插入( 在/usr/include/c++/4.4/bits/stl_map.h:540处,this=0x632a20,_位置=…,_x=…) #std::map、std::allocator>、http::servlet*(*)()、std::less、std::allocator>、std::allocator、std::allocator>常量、http::servlet*(*)()>::运算符[]( 在/usr/include/c++/4.4/bits/stl_map.h:450处,this=0x632a20,u k=…) #http::servlet::add_creator(type=0x4234d0)/gpu/european_opt_xyz“,func=0x421567)中的6 0x00000000004E3B1 地址./src/http.cpp:336
您可能会遇到静态初始化问题:


你是如何初始化地图的?

只是胡乱猜测……这可能是原因吗