C++11 源于set::erase的双自由错误
我一直得到运行时错误加倍免费或腐败!上。我花了一段时间尝试,我想我可以想出一个更小的可复制的例子 此代码会产生类似的双重自由错误。这是怎么回事?我认为set::erase会增加迭代器C++11 源于set::erase的双自由错误,c++11,iterator,set,C++11,Iterator,Set,我一直得到运行时错误加倍免费或腐败!上。我花了一段时间尝试,我想我可以想出一个更小的可复制的例子 此代码会产生类似的双重自由错误。这是怎么回事?我认为set::erase会增加迭代器 #include <iostream> #include <set> #include <string> int main() { std::set<int> tmp = {1,2,3}; for(auto num = tmp.begin(); n
#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会增加迭代器
#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;
}
它不会增加迭代器。它返回下一个迭代器。擦除后,迭代器num无效。有效代码如下所示
for(auto num = tmp.begin(); num != tmp.end(); ) {
if(true) {
std::cout << "removing...\n";
num = tmp.erase(num);
}
}