C++ std::set erase函数出现SEGV(段错误),求问题原因排查
std::set erase操作段错误的原因及修复
核心错误原因
你代码中段错误的直接原因是跨容器使用迭代器调用erase:myset.erase(myset2.begin(), myset2.end());
C++标准明确规定,std::set::erase(iterator first, iterator last)的两个迭代器参数必须指向当前调用erase的容器(即myset),或者last是该容器的end()迭代器。myset2是完全独立的另一个set容器,它的迭代器和myset的内部存储毫无关联,跨容器传递迭代器属于未定义行为,直接触发内存访问错误(SEGV)。
其他代码问题
另外你的代码还有一个语法错误:循环中的it没有声明类型,需要添加std::set<int>::iterator(或者用C++11及以上的auto简化)。
修复后的代码
如果你的需求是删除myset中所有存在于myset2的元素,可以遍历myset2的元素逐个删除:
#include <iostream> #include <set> int main () { std::set<int> myset; // insert some values: for (int i=1; i<10; i++) myset.insert(i*10); // 10 20 30 40 50 60 70 80 90 myset.erase (40); std::set<int> myset2; myset2.insert(70); myset2.insert(90); // 遍历myset2,逐个删除myset中的对应元素 for (int val : myset2) { myset.erase(val); } std::cout << "myset contains:"; for (std::set<int>::iterator it=myset.begin(); it!=myset.end(); ++it) std::cout << ' ' << *it; std::cout << '\n'; return 0; }
或者用C++11及以上的auto简化输出循环:
for (auto it=myset.begin(); it!=myset.end(); ++it) std::cout << ' ' << *it;
输出结果
修复后运行代码会输出:
myset contains: 10 20 30 50 60 80
内容的提问来源于stack exchange,提问作者user22379956
相关产品推荐
相关产品推荐

