程序在处理矢量时会接收`sigtrap'

Program receives `SIGTRAP` when deallocating vector

本文关键字:sigtrap 处理 程序      更新时间:2023-10-16

我有此代码,该代码应该在 std::vector<std::vector<int>>中的所有向量中查找元素:

for(int x = 0;x < list.size();x++){
    for(int y = 0;y < list[x].size();y++){
        std::vector<std::vector<int>::iterator> ptr;
        for(int z = 1;z < list.size();z++){
            std::vector<int>::iterator iter = std::find(list[z].begin(),
                    list[z].end(), list[x][y]);
            if(iter != list[z].end()){
                ptr.push_back(iter);
            }else
                goto fail;
        }
        list[0].erase(list[0].begin() + y);
        for(int z = 1;z <= ptr.size();z++){
            list[z].erase(ptr[z - 1]);
        }
        fail: continue;
    }
}

该程序总是产生错误的输出,并随机崩溃。调试表明,在ntdll中解构list时,它会接收SIGTRAP。这是随机发生的,但是该程序永远无法正常工作。我在代码中没有任何断点。

这些是我在问此问题后的某个时间中在代码中发现的错误:

  • 确定哪个迭代器的代码仅为list[0]设计,而不是为list[x]设计,而导致erase()被属于另一个向量的迭代器,从而导致内存损坏。
  • x在某些地方被0替换(忘了更改(。
  • list在程序中被其他代码损坏(现在已修复(。

这些是修复:

  • 使用迭代器到std::vector<std::vector<int>::iterator>if(z==x)continue;else{list[z].erase(*iter); iter++;}确保iter 始终指向正确的元素。
  • x替换0
  • 在程序的其他地方解决了问题。

该程序现在正常工作,感谢您尝试帮助我。