映射值出错的迭代器

时间:2019-12-28 15:07:49

标签: c++ address-sanitizer

使用C ++已有很长时间了,非常感谢!

这是一个简单的LRU缓存演示,我打算使用true来跟踪std::list<std::pair<int, int>>::iterator中的数据项,但是似乎出了点问题,所以std::list告诉我{{1} }警告。

-fsanitizer
  

错误

heap-use-after-free

1 个答案:

答案 0 :(得分:2)

SimpleLRU::get中,由于key中已经存在cache_,因此呼叫cache_.emplace(key, list_.begin())是空操作-它不会用新值替换现有值。结果,cache_最终持有无效的迭代器。做吧

it->second = list_.begin();

SimpleLRU::put中的类似问题,只是在这里,您并不总是拥有方便地访问现有地图元素的迭代器。处理此问题留给读者练习。