简体   繁体   English

使用operator []时std :: map segfaults

[英]std::map segfaults when using operator []

I have a strange issue. 我有一个奇怪的问题。 I'm using a factory registration pattern which refers internally to a std::map. 我正在使用工厂注册模式,它在内部引用std :: map。 I'm using this approach for multiple components, and registration happens at multiple points in different units of compilation (aka .cpp files). 我正在将这种方法用于多个组件,并且在不同的编译单元(即.cpp文件)中的多个点处进行注册。 This happens at static variables initialization time (before 'main' gets called). 这发生在静态变量初始化时(在调用'main'之前)。 For some strange reason I get a segfault when I'm referring to 出于一些奇怪的原因,我指的是一个段错误

map[key] = value;

(basically when I register a particular pfn). (基本上当我注册一个特定的pfn时)。 Now, if I move the registrations for that particular troublesome components in the same compilation unit, everything works. 现在,如果我在同一个编译单元中移动特定麻烦组件的注册,一切正常。 Again, if I move back the registration of just one component away, I get a segfault. 再说一遍,如果我只撤回一个组件的注册,我会得到一个段错误。

I have to say, it's not the first time I use this pattern and it works for the same executable for other components (ie components spread across multiple .cpp for another factory type get registered at initialization time without issues, using basically similar source code). 我不得不说,这不是我第一次使用这种模式,它适用于其他组件的相同可执行文件(即,在初始化时没有问题的情况下,在另一个工厂类型的多个.cpp上传播的组件使用基本相似的源代码) 。

what should I do? 我该怎么办? For now I've left the registration of the components in the same .cpp (and it works flawlessly). 现在我已经将组件的注册保留在同一个.cpp中(并且它可以完美地工作)。 How can I better investigate? 我怎样才能更好地调查?

I'm using g++ (Ubuntu/Linaro 4.4.4-14ubuntu5) 4.4.5 我正在使用g ++(Ubuntu / Linaro 4.4.4-14ubuntu5)4.4.5

Below stacktrace 在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

You could be coming up against the static initialization problem: 您可能遇到静态初始化问题:

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

How are you initialising the map? 你是如何初始化地图的?

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM