我有这段代码,它应该查找 std::vector<std::vector<int>>
中所有 vector 中存在的元素。 :
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;
}
}
程序总是产生错误的输出并随机崩溃。调试显示收到SIGTRAP
解构时list
在ntdll
。这种情况是随机发生的,但程序永远无法正常运行。我的代码中没有任何断点。
最佳答案
这些是我在提出这个问题后一段时间在代码中发现的错误:
- 用于确定哪个迭代器来自哪个数组的代码仅为
list[0]
设计。 ,而不是为list[x]
设计的,导致erase()
使用属于另一个 vector 的迭代器调用,导致内存损坏。 -
x
被替换为0
在某些地方(忘记更改它)。 -
list
被程序中的其他代码损坏(现已修复)。
修复如下:
- 使用迭代器
std::vector<std::vector<int>::iterator>
和if(z==x)continue;else{list[z].erase(*iter); iter++;}
确保iter
始终指向正确的元素。 - 已替换
0
与x
. - 修复了程序中其他地方的问题。
程序现在可以正常工作了,感谢您尝试帮助我。
关于c++ - 程序在释放 vector 时收到 `SIGTRAP`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43570069/