【问题标题】:std::map segfaults when using operator []使用运算符 [] 时的 std::map 段错误
【发布时间】:2011-07-10 07:16:00
【问题描述】:

我有一个奇怪的问题。 我正在使用内部引用 std::map 的工厂注册模式。 我将这种方法用于多个组件,并且注册发生在不同编译单元(又名 .cpp 文件)的多个点。这发生在静态变量初始化时(在调用“main”之前)。 出于某种奇怪的原因,当我提到时会出现段错误

map[key] = value;

(基本上当我注册一个特定的 pfn 时)。 现在,如果我在同一个编译单元中移动特定麻烦组件的注册,一切正常。 同样,如果我只移回一个组件的注册,我会得到一个段错误。

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

我该怎么办? 现在我已经将组件的注册留在了同一个 .cpp 中(并且它完美地工作)。 我怎样才能更好地调查?

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

在堆栈跟踪下

来自 /usr/lib/libstdc++.so.6 的 std::_Rb_tree_decrement(std::_Rb_tree_node_base*) () 中的 0x00007ffff793da1a (gdb) BT #0 0x00007ffff793da1a in std::_Rb_tree_decrement(std::_Rb_tree_node_base*) () 来自 /usr/lib/libstdc++.so.6 #1 0x0000000000413fe9 in std::_Rb_tree_iterator, std::allocator > const, http::servlet* (*)()> >::operator-- ( 这=0x7fffffffdff0) 在/usr/include/c++/4.4/bits/stl_tree.h:199 #2 0x000000000041379d 在 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 在 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 在 std::map, std::allocator >, http::servlet* (*)(), std::less, std::allocator > >, std::allocator, std::allocator > const, http::servlet* (*)()> > >::insert ( this=0x632a20, __position=..., __x=...) 在 /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=...) 在 /usr/include/c++/4.4/bits/stl_map.h:450 #6 0x000000000040e3b1 在 http::servlet::add_creator (type=0x4234d0 "/gpu/european_opt_xyz", func=0x421567 ) 在 ./src/http.cpp:336

【问题讨论】:

标签: c++ initialization segmentation-fault factory stdmap


【解决方案1】:

您可能会遇到静态初始化问题:

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

你是如何初始化地图的?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 2012-01-12
    • 2011-04-07
    相关资源
    最近更新 更多