gpt4 book ai didi

c++ - 使用 std::map/boost::unordered_map 帮助理解段错误

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:00:23 27 4
gpt4 key购买 nike

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

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();

“资源类型”必须有一个采用 const std::string& 的构造函数.

getResource实现如下:

static boost::shared_ptr<const ResourceType> getResource(const std::string& fileName)
{
boost::shared_ptr<ResourceType> resource;

typename table_t::const_iterator itr = _resources.find(fileName);
if (itr == _resources.end()) {
resource.reset(new ResourceType(_dataDirectory + fileName));
_resources[fileName] = resource;
} else {
resource = itr->second;
}

return resource;
}

table_t定义为 typedef typename boost::unordered_map< std::string, boost::shared_ptr<ResourceType> > table_t;

_resources类型为 table_t .

问题出在boost::unordered_map我在调用 find 时遇到段错误(源自 find_iterator )。但是,使用 std::map相反,我在插入操作(源自 _Rb_tree_decrement )或调用 find 时遇到段错误(源自 string::compare )。

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

因为 map 都发生了这种情况和 unordered_map我假设我一定是在某个地方做了一些奇怪的事情来引起这种情况,有什么想法吗?

谢谢。

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

这是堆栈跟踪:

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

最佳答案

我找不到任何明显的错误,你试过了吗Valgrind (假设你运行某种 *nix 系统)?它是查找内存错误的宝贵工具,看起来它可能就是其中之一。

关于c++ - 使用 std::map/boost::unordered_map 帮助理解段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3200360/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com