C++ push_back上的STL列表分段错误
我在使用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
#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
的要点。