push_back上的 STL 列表分段错误



我在使用 STL 的列表时遇到问题。我正在加载格式的二合字母

#of_tests
#of_vertexes #of_edges
#vertex1 > #vertex2
#vertex3 > #vertex4
...

但是我在邻接列表上第一次调用 push_back 时得到了一个 SIGSEGV,我真的很困惑 - 列表数组已初始化,所以我不会在 null 上调用它。

我已经检查了测试,并且我在范围内(我从不调用超出分配数组的方法)。

这是代码

#include <iostream>
#include <list>
using namespace std;
int * deg_in;
list<int> * edge;
int n;
int main()
{
    int z;
    cin >> z;
    deg_in = new int[n]();
    edge = new list<int>[n]();
    while(z--)
    {
        int m;
        cin >> n >> m;
        while(m--)
        {
            int a, b;
            char trash;
            cin >> a >> trash >> b;
            /// Vertexes are given 1 .. n, but stored 0 .. n - 1
            a--;
            b--;
            edge[a].push_back(b);   /// code fails here
            deg_in[b]++;
        }
/// do somethig with graph

    delete [] deg_in;
    delete [] edge;
}

    return 0;
}

任何帮助,不胜感激。

您的代码在输入 n 之前分配deg_inedge数组。由于 n 是在全局范围内声明的,因此它被初始化为零,因此数组的长度为 0。因此,SIGSEGV 的出现是因为程序试图访问内存的未分配部分。

此外,在尝试处理第一个测试用例后立即删除数组,并且不会为每个测试用例重新分配数组。

从上下文来看,deg_inedge 数组似乎是每个测试用例的。在这种情况下,代码应为:

while (z--)
{
    int m;
    cin >> n >> m;
    deg_in = new int[n]();
    edge = new list<int>[n]();
    // input graph
    delete [] deg_in;
    delete [] edge;
}

就像Paul R说的那样,始终如一地格式化代码有助于减少简单错误的机会。干杯。

您正在循环中删除数据,因此您将在第二次迭代时崩溃。这并不明显,因为代码格式不正确。改变:

/// do somethig with graph

    delete [] deg_in;
    delete [] edge;
}

自:

/// do somethig with graph
    }
    delete [] deg_in;
    delete [] edge;

或者,您可以改为在循环中分配和取消分配。

带回家的信息:始终注意正确格式化代码,否则您更有可能犯像这样难以发现的简单错误。

相关内容

  • 没有找到相关文章

最新更新