0

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

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

任何想法 ?

4

1 回答 1

1

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

于 2013-02-11T01:09:46.753 回答