定期清理地图
Clean map periodically
我有一个class管理地图。
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 ***
上面的代码有意义吗?如果是,错误可能在哪里?如果没有,我该如何定期清理地图?
添加具有相同键的元素时出现问题。
当使用存在的键调用 emplace_hint
时,您将推入双端队列重复的迭代器(emplace_hint
returns 迭代器到已存在的元素 map::emplace_hint)。
当 deque 和 map 被清除时,您调用 map::erase
但它只接受有效和可取消引用的迭代器。因此,当为重复的迭代器 (map::erase) 调用 erase
时,代码崩溃,因为此项在之前的 erase
调用中被删除。
我有一个class管理地图。
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 ***
上面的代码有意义吗?如果是,错误可能在哪里?如果没有,我该如何定期清理地图?
添加具有相同键的元素时出现问题。
当使用存在的键调用 emplace_hint
时,您将推入双端队列重复的迭代器(emplace_hint
returns 迭代器到已存在的元素 map::emplace_hint)。
当 deque 和 map 被清除时,您调用 map::erase
但它只接受有效和可取消引用的迭代器。因此,当为重复的迭代器 (map::erase) 调用 erase
时,代码崩溃,因为此项在之前的 erase
调用中被删除。