c++;代码正常工作,但进程以终止结束,而不是返回0 我在CODBoLD中编写了一个简单的C++代码,并实现了动态内存分配的栈和图形类。 我的代码工作正常,输出正确,但最后显示***.exe已停止工作错误,并在生成日志中显示“进程已终止,状态为-1073741819”。 我尝试了GNUGDB6.8调试器,但它找不到任何错误

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() {

这个问题是在imlementing stack类之后出现的,所以这是我的代码,如果它可以帮助解决问题的话:

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。