C++ 使用std::map/boost::无序映射帮助理解segfault

C++ 使用std::map/boost::无序映射帮助理解segfault,c++,boost,map,segmentation-fault,unordered-map,C++,Boost,Map,Segmentation Fault,Unordered Map,我有一些代码使用模板的静态类处理资源(图像、字体、网格数据等)管理,允许客户端代码执行以下操作: ResourceManager<Texture>::init("data/textures"); ResourceManager<Font>::init("data/fonts"); // later ... boost::shared_ptr<const Texture> tex = ResourceManager<Texture>::getReso

我有一些代码使用模板的静态类处理资源(图像、字体、网格数据等)管理,允许客户端代码执行以下操作:

ResourceManager<Texture>::init("data/textures");
ResourceManager<Font>::init("data/fonts");
// later ...
boost::shared_ptr<const Texture> tex = ResourceManager<Texture>::getResource("wall.png");
boost::shared_ptr<const Font> font = ResourceManager<Font>::getResource("Arial.ttf");
// later ...
ResourceManager<Texture>::release();
table_t
被定义为
typedef typename boost::unordered_maptable

\u资源
属于
类型

问题在于
boost::unordered_map
调用
find
(源自
find_迭代器
)时,我得到了一个segfault。但是,如果使用
std::map
,我要么在插入操作(源自
\u Rb\u tree\u decrement
)上获得segfault,要么在调用
find
(源自
string::compare
)时获得segfault

该问题仅在第二次请求资源时发生(发生故障时文件名有效)

由于
map
unordered\u map
都发生了这种情况,我想我一定是在某个地方做了一些奇怪的事情导致了这种情况,有什么想法吗

谢谢

编辑:仍然有问题,我错了,它只发生在第二次请求资源时。但是,获取资源的前两个调用成功,导致SEGFULT的是第三个调用(每个调用针对不同的资源)

以下是堆栈跟踪:

Program received signal SIGSEGV, Segmentation fault.
0x00000000004b4978 in boost::unordered_detail::hash_table<boost::unordered_detail::map<std::string, boost::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<std::string const, boost::shared_ptr<Texture> > > > >::find_iterator (this=0x7aed80, bucket=0x38, k=...)
    at /usr/local/include/boost/unordered/detail/table.hpp:55
55          node_ptr it = bucket->next_;
(gdb) bt
#0  0x00000000004b4978 in boost::unordered_detail::hash_table<boost::unordered_detail::map<std::string, boost::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<std::string const, boost::shared_ptr<Texture> > > > >::find_iterator (this=0x7aed80, bucket=0x38, k=...)
    at /usr/local/include/boost/unordered/detail/table.hpp:55
#1  0x00000000004b294c in boost::unordered_detail::hash_table<boost::unordered_detail::map<std::string, boost::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<std::string const, boost::shared_ptr<Texture> > > > >::find (this=0x7aed80, k=...)
    at /usr/local/include/boost/unordered/detail/table.hpp:583
#2  0x00000000004b07c1 in boost::unordered_map<std::string, boost::shared_ptr<Texture>, boost::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<std::string const, boost::shared_ptr<Texture> > > >::find (this=0x7aed80, k=...)
    at /usr/local/include/boost/unordered/unordered_map.hpp:423
#3  0x00000000004ae7c6 in ResourceManager<Texture>::getResource (fileName=...) at /home/tim/Projects/gameproj/app/ResourceManager.hpp:52
#4  0x00000000004ce7fc in Map::loadCellTextures (this=0x7fffffffdfc0, in=...) at /home/tim/Projects/gameproj/app/Map.cpp:57
#5  0x00000000004ce632 in Map (this=0x7fffffffdfc0, fileName=...) at /home/tim/Projects/gameproj/app/Map.cpp:30
#6  0x0000000000495702 in Game::init (xResolution=1024, yResolution=768) at /home/tim/Projects/gameproj/app/Game.cpp:116
#7  0x0000000000494fa0 in Game::run (xResolution=1024, yResolution=768) at /home/tim/Projects/gameproj/app/Game.cpp:38
#8  0x0000000000487f1d in Main::run (xResolution=1024, yResolution=768) at /home/tim/Projects/gameproj/app/Main.cpp:28
#9  0x0000000000487db5 in main (argc=1, argv=0x7fffffffe398) at /home/tim/Projects/gameproj/app/main.cpp:10
程序接收信号SIGSEGV,分段故障。
boost::无序_详细信息::散列_表::查找_迭代器中的0x00000000004b4978(this=0x7aed80,bucket=0x38,k=…)
at/usr/local/include/boost/unordered/detail/table.hpp:55
55节点\u ptr it=bucket->next;
(gdb)英国电信
#boost::无序_详细信息::哈希_表::查找迭代器中的0 0x00000000004b4978(this=0x7aed80,bucket=0x38,k=…)
at/usr/local/include/boost/unordered/detail/table.hpp:55
#boost::无序_详细信息::哈希_表::查找中的1 0x00000000004b294c(this=0x7aed80,k=…)
at/usr/local/include/boost/unordered/detail/table.hpp:583
#boost::无序映射::find中的2 0x00000000004b07c1(this=0x7aed80,k=…)
at/usr/local/include/boost/unordered/unordered_map.hpp:423
#在/home/tim/Projects/gameproj/app/ResourceManager.hpp:52中的ResourceManager::getResource(文件名=…)中的3 0x00000000004ae7c6
#4 0x00000000004ce7fc位于/home/tim/Projects/gameproj/app/Map.cpp:57的Map::loadCellTextures(this=0x7fffffffffc0,in=…)中
#5 0x00000000004ce632位于/home/tim/Projects/gameproj/app/Map.cpp:30的映射(this=0x7fffffffdfc0,fileName=…)中
#6 0x0000000000495702在/home/tim/Projects/gameproj/app/Game.cpp:116中的游戏::init(xResolution=1024,yResolution=768)
#游戏中的7 0x0000000000494fa0::在/home/tim/Projects/gameproj/app/Game运行(xResolution=1024,yResolution=768)。cpp:38
#Main中的8 0x0000000000487f1d::在/home/tim/Projects/gameproj/app/Main.cpp:28处运行(xResolution=1024,yResolution=768)
#在/home/tim/Projects/gameproj/app/main.cpp:10中,main中的9 0x0000000000487db5(argc=1,argv=0x7fffffffe398)
该问题仅在第二次请求资源时发生


这向我表明,您的代码可能正在释放资源—第一次一切正常,然后您将其释放,然后容器下次尝试访问该内存时,它将出现故障。

我无法发现任何明显的错误,您是否尝试过(假设您运行某种*nix系统)?它是查找内存错误的一个非常宝贵的工具,看起来它可能就是其中之一。

看,我也遇到了类似的问题。 我的班级在BlackBerry的编译器和QMake4上做得很好。但在qtcreator 5(64和32b)上,我遇到了同样的问题。 我追踪到了这个

看起来默认构造函数在某些编译器上没有正确初始化。 我在父类构造函数上添加了一个
clear()
,现在似乎可以工作了

如果您有一些静态声明(或者更糟糕的外部声明),并且应该实例化映射的时间不是预期的,那么也可能发生这种情况


我希望它能有所帮助。

+1对于推荐valgrind,它是一个非常宝贵的工具,值得您花时间来学习。我对valgrind有点熟悉,当SEGFULT发生时,我收到“大小为8的无效读取”。有问题的行是
node\u ptr it=bucket->next在table.hpp(boost的一部分)中。使用调试器时,
bucket
似乎处于悬空状态/未初始化状态。@Tim:这是一个线索,但我怀疑错误是否在boost本身。如果你提供更多的上下文,有人可能会发现它。如何声明/初始化/销毁资源等?在sig11发生时从gdb添加回溯可以帮助诊断。
\u资源
声明为
静态表\u t\u资源,并初始化为:
模板boost::无序映射ResourceFactory::\u资源在类定义下面。有一个静态的
release
函数被调用来释放资源,这只是通过
\u resources.clear()
完成的。你解决了这个问题吗?我在ubuntu 64上遇到了一个与qmake非常类似的问题。奇怪的是,同样的代码在BlackBerry10(qnx)上运行得非常好
Program received signal SIGSEGV, Segmentation fault.
0x00000000004b4978 in boost::unordered_detail::hash_table<boost::unordered_detail::map<std::string, boost::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<std::string const, boost::shared_ptr<Texture> > > > >::find_iterator (this=0x7aed80, bucket=0x38, k=...)
    at /usr/local/include/boost/unordered/detail/table.hpp:55
55          node_ptr it = bucket->next_;
(gdb) bt
#0  0x00000000004b4978 in boost::unordered_detail::hash_table<boost::unordered_detail::map<std::string, boost::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<std::string const, boost::shared_ptr<Texture> > > > >::find_iterator (this=0x7aed80, bucket=0x38, k=...)
    at /usr/local/include/boost/unordered/detail/table.hpp:55
#1  0x00000000004b294c in boost::unordered_detail::hash_table<boost::unordered_detail::map<std::string, boost::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<std::string const, boost::shared_ptr<Texture> > > > >::find (this=0x7aed80, k=...)
    at /usr/local/include/boost/unordered/detail/table.hpp:583
#2  0x00000000004b07c1 in boost::unordered_map<std::string, boost::shared_ptr<Texture>, boost::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<std::string const, boost::shared_ptr<Texture> > > >::find (this=0x7aed80, k=...)
    at /usr/local/include/boost/unordered/unordered_map.hpp:423
#3  0x00000000004ae7c6 in ResourceManager<Texture>::getResource (fileName=...) at /home/tim/Projects/gameproj/app/ResourceManager.hpp:52
#4  0x00000000004ce7fc in Map::loadCellTextures (this=0x7fffffffdfc0, in=...) at /home/tim/Projects/gameproj/app/Map.cpp:57
#5  0x00000000004ce632 in Map (this=0x7fffffffdfc0, fileName=...) at /home/tim/Projects/gameproj/app/Map.cpp:30
#6  0x0000000000495702 in Game::init (xResolution=1024, yResolution=768) at /home/tim/Projects/gameproj/app/Game.cpp:116
#7  0x0000000000494fa0 in Game::run (xResolution=1024, yResolution=768) at /home/tim/Projects/gameproj/app/Game.cpp:38
#8  0x0000000000487f1d in Main::run (xResolution=1024, yResolution=768) at /home/tim/Projects/gameproj/app/Main.cpp:28
#9  0x0000000000487db5 in main (argc=1, argv=0x7fffffffe398) at /home/tim/Projects/gameproj/app/main.cpp:10