c++ - 程序在释放 vector 时收到 `SIGTRAP`

标签 c++ memory vector crash

我有这段代码,它应该查找 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解构时listntdll 。这种情况是随机发生的,但程序永远无法正常运行。我的代码中没有任何断点。

最佳答案

这些是我在提出这个问题后一段时间在代码中发现的错误:

  • 用于确定哪个迭代器来自哪个数组的代码仅为 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 始终指向正确的元素。
  • 已替换 0x .
  • 修复了程序中其他地方的问题。

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

关于c++ - 程序在释放 vector 时收到 `SIGTRAP`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43570069/

相关文章:

c - 使用 realloc() 将数组的大小加倍

ios - 如何通过 ViewControllers 管理和释放内存

c++ - 从 for 循环中的 vector 中删除元素 - C++

c++ - 保持常量的指针 vector

c++ - 将指针 push_back 指向 vector 的正确方法

android - 构建testcpp Eclipse项目后报错

c++ - 推断声明的类型

c++ - 使用 LAPACK 访问子矩阵

c - C 程序的内存布局(物理 View 与逻辑 View )

c - 想知道如何添加 vector 数组?