STL设置在Map内部,奇怪的seg错误和Valgrind分析

时间:2013-02-10 23:49:40

标签: c++ map stl set valgrind

我的代码中有一个奇怪的分段错误,它使用以下数据结构:

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

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

我没有看到针对end()的任何检查,所以我会猜测你的find调用实际上没有找到密钥并返回end迭代器。一旦你开始取消引用它,所有关于行为的赌注都将被取消。您应该使用operator[]始终创建元素,或检查findend的结果。