我的代码中有一个奇怪的分段错误,它使用以下数据结构:
map< uint64_t, set<uint64_t> > _key_to_block;
Valgrind抱怨_key_to_block.erase(it)
有这条消息:
Address 0x6106118 is 56 bytes inside a block of size 88 free'd
用于从地图中删除元素,如下所示:
map< uint64_t, set<uint64_t> >::iterator it = _key_to_block.find(key);
(it->second).clear();
_key_to_block.erase(it);
此外,Valgrind还抱怨(it->second).insert(k);
进行按摩:
Invalid read of size 8
用于在STL集中插入元素,如下所示:
map< uint64_t, set<uint64_t> >::iterator it = _key_to_block.find(key);
(it->second).insert(value);
然而,它没有抱怨这一行:
setit = it->second.find(value);
有什么想法吗?
答案 0 :(得分:1)
我没有看到针对end()
的任何检查,所以我会猜测你的find
调用实际上没有找到密钥并返回end
迭代器。一旦你开始取消引用它,所有关于行为的赌注都将被取消。您应该使用operator[]
始终创建元素,或检查find
对end
的结果。