You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 20:22:36