C++11 源于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

我一直得到运行时错误加倍免费或腐败!上。我花了一段时间尝试,我想我可以想出一个更小的可复制的例子

此代码会产生类似的双重自由错误。这是怎么回事?我认为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会增加迭代器

#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);
    }
}