解除分配向量

时间:2017-04-23 10:39:44

标签: c++ memory vector crash

我有这个代码,它应该寻找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;
    }
}

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

1 个答案:

答案 0 :(得分:0)

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

  • 用于确定哪个迭代器来自哪个数组的代码仅用于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 始终指向正确的元素。
  • 0替换为x
  • 解决了该计划其他地方的问题。

该程序现在正常运行,感谢您试图帮助我。