我一直得到运行时错误double free or corruption (!prev)
。我花了一段时间尝试,我想我可以想出一个更小的可复制的例子。
此代码会产生类似的"双自由"错误。这是怎么回事?我认为set::erase
会增加迭代器。
#include <iostream>
#include <set>
#include <string>
int main() {
std::set<int> tmp = {1,2,3};
for(auto num = tmp.begin(); num != tmp.end(); ) {
if(true) {
std::cout << "removing...n";
tmp.erase(num);
}
}
return 0;
}
我认为set::erase递增迭代器。
它不递增迭代器。它返回下一个迭代器。在擦除之后,迭代器num
被无效。有效代码如下所示。
for(auto num = tmp.begin(); num != tmp.end(); ) {
if(true) {
std::cout << "removing...n";
num = tmp.erase(num);
}
}