【问题标题】:a double free error stemming from set::erase源自 set::erase 的双重释放错误
【发布时间】:2020-02-23 05:33:20
【问题描述】:

我不断收到运行时错误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;
}

【问题讨论】:

    标签: c++11 iterator set


    【解决方案1】:

    我认为 set::erase 会增加迭代器。

    它不会增加迭代器。它返回下一个迭代器。擦除后,迭代器num 失效。有效代码如下所示。

    for(auto num = tmp.begin(); num != tmp.end(); ) {
        if(true) {
            std::cout << "removing...\n";
            num = tmp.erase(num);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2014-11-10
      • 2017-02-26
      • 1970-01-01
      • 2013-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-18
      相关资源
      最近更新 更多