1

我有一个管理地图的 A 类。

class A {
 public:
  A() {}
  void addElem(uint8_t a, const B& b) {
    std::lock_guard<std::mutex> lock(_mutex);
    auto result = _map.emplace_hint(_map.end(), a, b);
    _deque.push_back(std::make_pair(result, time(nullptr)));
  }
  void cleanMap() {
    std::lock_guard<std::mutex> lock(_mutex);
    _map.erase(_deque.front().first);
    _deque.pop_front();
  }
 private:
  std::map<uint8_t, B> _map;
  std::deque<std::pair<std::map<uint8_t, B>::iterator, time_t>> _deque;
  std::mutex _mutex;
};

当我在我的地图中添加很多元素时,我想通过删除第一次插入的元素来定期清理它。

if (difftime(time(nullptr), _deque.front().second > EXPIRY)) {
  cleanMap();
}

当我尝试从双端队列中弹出元素时,以下代码有时会崩溃:

double free or corruption (fasttop): 0x00007fffdc000900 ***

上面的代码有意义吗?如果是,错误可能在哪里?如果没有,我怎样才能定期清理地图?

4

1 回答 1

3

添加具有相同键的元素时会出现问题。

emplace_hint使用存在的键调用时,您推送 deque 重复的迭代器(emplace_hint将迭代器返回到已经存在的元素map::emplace_hint)。当 deque 和 map 被清除时,您调用map::erase但它只接受有效且可取消引用的迭代器。因此,当erase为重复的迭代器(map::erase)调用时,代码会崩溃,因为该项目在之前的erase调用中已被删除。

于 2019-03-06T09:55:06.730 回答