C++ push_back上的STL列表分段错误

C++ push_back上的STL列表分段错误,c++,list,stl,segmentation-fault,C++,List,Stl,Segmentation Fault,我在使用STL列表时遇到问题。 我正在加载一个有向图的格式 #of_tests #of_vertexes #of_edges #vertex1 > #vertex2 #vertex3 > #vertex4 ... 但是在我的邻接列表上第一次调用push_时,我得到了一个SIGSEGV,我真的很困惑-列表数组是初始化的,所以我不调用null 我已经检查了测试,并且在范围内(我从未调用分配数组之外的方法) 这是密码 #include <iostream> #include

我在使用STL列表时遇到问题。 我正在加载一个有向图的格式

#of_tests
#of_vertexes #of_edges
#vertex1 > #vertex2
#vertex3 > #vertex4
...
但是在我的邻接列表上第一次调用push_时,我得到了一个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;
}
#包括
#包括
使用名称空间std;
内*deg_英寸;
列表*边缘;
int n;
int main()
{
intz;
cin>>z;
deg_in=新整数[n]();
edge=新列表[n]();
而(z--)
{
int m;
cin>>n>>m;
而(m--)
{
INTA,b;
煤焦垃圾;
cin>>a>>垃圾>>b;
///顶点给定为1..n,但存储为0..n-1
a——;
b--;
edge[a]。推回(b);///代码在此失败
[b]++中的deg_;
}
///用图形做些什么
删除中的[]度;
删除[]边;
}
返回0;
}

非常感谢您的帮助。

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

/// do somethig with graph


    delete [] deg_in;
    delete [] edge;
}
致:

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


带回家的信息:始终注意正确设置代码的格式,否则很可能会出现类似这样的简单而难以发现的错误。

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

/// do somethig with graph


    delete [] deg_in;
    delete [] edge;
}
致:

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


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

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

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

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

while (z--)
{
    int m;
    cin >> n >> m;

    deg_in = new int[n]();
    edge = new list<int>[n]();

    // input graph

    delete [] deg_in;
    delete [] edge;
}
while(z--)
{
int m;
cin>>n>>m;
deg_in=新整数[n]();
edge=新列表[n]();
//输入图
删除中的[]度;
删除[]边;
}

正如Paul R所说,一致地格式化代码有助于减少发生简单错误的机会。干杯。

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

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

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

while (z--)
{
    int m;
    cin >> n >> m;

    deg_in = new int[n]();
    edge = new list<int>[n]();

    // input graph

    delete [] deg_in;
    delete [] edge;
}
while(z--)
{
int m;
cin>>n>>m;
deg_in=新整数[n]();
edge=新列表[n]();
//输入图
删除中的[]度;
删除[]边;
}

正如Paul R所说,一致地格式化代码有助于减少发生简单错误的机会。干杯。

使用调试器检查
边缘[a]处
a
的值。向后推(b)
push_back()
失败时,
a
的值是多少?你能把它简化为a吗?@Barry:我已经回滚了你的代码格式编辑,因为问题似乎主要是由于代码格式不好造成的,因此,在这种情况下,不幸的格式需要为后代保留。为什么要保留所有指针和动态分配?您似乎完全忽略了
std::list
的要点。使用调试器在
edge[a]处检查
a
的值。向后推(b)
push_back()
失败时,
a
的值是多少?你能把它简化为a吗?@Barry:我已经回滚了你的代码格式编辑,因为问题似乎主要是由于代码格式不好造成的,因此,在这种情况下,不幸的格式需要为后代保留。为什么要保留所有指针和动态分配?您似乎完全忽略了
std::list
的要点。