源于set::erase的双自由错误



我一直得到运行时错误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);
}
}

最新更新