我需要在函数内部使用迭代器来擦除映射元素,该函数以映射迭代器为参数,但出现运行时错误(free((:检测到双free(。这是我的代码:
#include <iostream>
#include <map>
std::map<int32_t, int32_t> mapp;
void erasee(std::map<int32_t, int32_t>::iterator itr) {
itr = mapp.erase(itr);
}
int main()
{
mapp.emplace(1, 1000);
std::map<int32_t, int32_t>::iterator itr = mapp.begin();
while(itr != mapp.end()) {
std::cout << "before" << std::endl;
erasee(itr);
std::cout << "after" << std::endl;
}
return 0;
}
itr
通过值传递给erasee
。因此,在erasee
返回后,重新分配它没有任何效果。
作为一个快速解决方案,您可以通过引用传递它:
void erasee(std::map<int32_t, int32_t>::iterator & itr) {
尽管返回一个新的迭代器可能是一个可读性更强的解决方案。