push_back上的STL列表分段错误

时间:2015-04-25 13:16:32

标签: c++ list stl sigsegv

使用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;
}

感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

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

merge.data.table

为:

/// do somethig with graph


    delete [] deg_in;
    delete [] edge;
}

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

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

答案 1 :(得分:2)

您的代码在输入deg_in之前会分配edgen数组。由于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所说的那样,格式化代码可以帮助减少出现简单错误的可能性。欢呼声。