C++ std::set 插入时读取无效

C++ std::set invalid read on insert

我正在用 C++ 编写服务器。我使用一个 std::set 容器来保存一个访问所有客户端内存对象的指针。我使用 valgrind 来检查我是否没有发生任何内存泄漏。当我第一次使用我的设备时,我的读取无效。我写了一些代码示例来解释我的问题。

#include <iostream>
#include <set>

using namespace std;

int main() {
  set<int> s;

  s.insert(1);
  s.insert(2);
  s.insert(3);

  for (auto it = s.begin(); it != s.end(); it++) {
    cout << "Data:" << *it << endl;
    s.erase(it);
  }

  return 0;
}

我用这些标志编译并用 valgrind 启动我的程序。

g++ -ggdb -std=c++17 set.cpp && valgrind ./a.out'

此代码将 "Invalid read of size 8" 生成为 std::_Rb_tree_increment(std::_Rb_tree_node_base const*)(在 /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21 中)

这不是来自我的代码所以我可以解决这个问题?

对不起我的英语,我正在学习...

调用 s.erase(it) 后,迭代器 it 不再有效。任何对迭代器的引用,例如在 it++ 中,都是未定义的行为。

貌似在it++调用std::_Rb_tree_increment的调用中递增it,此时处于无效状态。 Valgrind 检测到这种情况,并报告无效读取。

it擦除后无效,但erasereturns是最后擦除元素后的迭代器,因此可以将循环更改为

for (auto it = s.begin(); it != s.end();) {
    cout << "Data:" << *it << endl;
    it = s.erase(it);
}