c++;代码正常工作,但进程以终止结束,而不是返回0 我在CODBoLD中编写了一个简单的C++代码,并实现了动态内存分配的栈和图形类。 我的代码工作正常,输出正确,但最后显示***.exe已停止工作错误,并在生成日志中显示“进程已终止,状态为-1073741819”。 我尝试了GNUGDB6.8调试器,但它找不到任何错误
这个问题是在imlementing stack类之后出现的,所以这是我的代码,如果它可以帮助解决问题的话:c++;代码正常工作,但进程以终止结束,而不是返回0 我在CODBoLD中编写了一个简单的C++代码,并实现了动态内存分配的栈和图形类。 我的代码工作正常,输出正确,但最后显示***.exe已停止工作错误,并在生成日志中显示“进程已终止,状态为-1073741819”。 我尝试了GNUGDB6.8调试器,但它找不到任何错误,c++,graph,stack,codeblocks,terminate,C++,Graph,Stack,Codeblocks,Terminate,这个问题是在imlementing stack类之后出现的,所以这是我的代码,如果它可以帮助解决问题的话: class stack { vertex* d; int end; public: stack() { end=0; d=NULL; } void create(int n) { d=new vertex[n]; } vertex top() {
class stack
{
vertex* d;
int end;
public:
stack()
{
end=0;
d=NULL;
}
void create(int n)
{
d=new vertex[n];
}
vertex top()
{
return d[end];
}
void push(vertex y)
{
end++;
d[end]=y;
}
vertex pop()
{
end--;
return d[end+1];
}
~stack()
{
if (d!=NULL)
delete d;
}
};
- 顶点类也在堆栈之前声明
- 对于某些输入,调试器说“程序接收到信号SIGSEGV,分段错误。”
int main()
{
G graf;
graf.get();
stack tree;
tree.create(graf.q()-1);
int q=0;
int i=0;
int u=0;
while (u<graf.q()-1)
{
tree.push(graf.u[i]);
if (graf.u[i].r[0]->flag > 0 && graf.u[i].r[1]->flag > 0 && u>=q)
tree.pop();
else
{
u++;
if (graf.u[i].r[0]->flag==0)
q++;
if (graf.u[i].r[1]->flag==0)
q++;
graf.u[i].r[0]->flag++;
graf.u[i].r[1]->flag++;
cout << tree.top().r[0]->name << " - " << tree.top().r[1]->name << '\n';
}
i++;
}
return 0;
}
intmain()
{
格拉夫;
graf.get();
堆栈树;
create(graf.q()-1);
int q=0;
int i=0;
int u=0;
while(uflag>0&&graf.u[i].r[1]->flag>0&&u>=q)
tree.pop();
其他的
{
u++;
if(graf.u[i].r[0]->flag==0)
q++;
if(graf.u[i].r[1]->flag==0)
q++;
graf.u[i].r[0]->flag++;
graf.u[i].r[1]->flag++;
cout name您的代码错误:
void push(vertex y)
{
end++;
d[end]=y;
}
应该是:
void push(vertex y)
{
d[end]=y;
end++;
}
否则,第一个按下的项目将转到位置1
,而不是位置0
此外,stack::top()
返回下一项,而不是最后一次推送:
vertex top()
{
return d[end];
}
应该是:
vertex top()
{
return d[end-1];
}
我很确定seg故障是由于未分配的内存被访问造成的,添加断言以使程序在出现错误时通知您,如:
class stack
{
vertex* d;
int cur;
int capacity;
public:
stack()
{
cur=0;
capacity=0;
d=NULL;
}
void create(int n)
{
assert( d == NULL );
capacity = n;
d=new vertex[n];
}
vertex top()
{
assert( cur != 0 );
return d[cur-1];
}
void push(vertex y)
{
cur++;
assert( cur < capacity );
d[cur]=y;
}
vertex pop()
{
assert( cur > 0 );
cur--;
return d[cur+1];
}
~stack()
{
if ( d != NULL )
delete [] d;
}
};
类堆栈
{
顶点*d;
int cur;
国际能力;
公众:
堆栈()
{
cur=0;
容量=0;
d=零;
}
无效创建(int n)
{
断言(d==NULL);
容量=n;
d=新顶点[n];
}
顶点顶()
{
断言(cur!=0);
返回d[cur-1];
}
无效推送(顶点y)
{
cur++;
断言(cur0);
cur--;
返回d[cur+1];
}
~stack()
{
如果(d!=NULL)
删除[]d;
}
};
然后,再次运行,您将看到从何处获得断言
最后,检查vertex
copy构造函数工作正常,因为推送/弹出操作会执行大量vertex
复制操作,如果此处出现错误,可能会导致seg故障。您从不检查end
over-flows还是underflows.@crown您不需要告诉我们,网站会自动用“此问题已编辑”。@crown是否将任何内容打印到控制台(即打印到控制台然后终止)?如果速度过快,请将该过程休眠1-2秒,以便您进行验证。delete d
应为delete[]d
但这不会导致seg错误。@鲍勃:是的,我在返回0之前添加了一个cout和一个getch,进程在打印和获取字符后终止!是的,这是错误的……但我认为更正应该是这样的:stack(){end=-1;d=NULL;}这是另一种选择。执行assert
检查,这将显示堆栈何时被错误使用。应该在析构函数中::delete[]d;
,因为它是数组。你是对的,我实际上在OP中对此进行了注释,并在复制/粘贴时忘记了它。Edited.Thx。