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);
}
我正在用 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);
}