c++ 代码工作正常,但进程以终止结束而不是 return 0

c++ code works properly but the process ends with termination instead return 0

我在代码块中编写了一个简单的 C++ 代码,并通过动态内存分配实现了堆栈和图形 classes。 我的代码工作正常并提供正确的输出,但最后它显示 ***.exe 已停止工作错误并在构建日志中显示 "Process terminated with status -1073741819"。 我尝试了 GNU gdb 6.8 调试器,但没有发现任何错误。

这个问题是在实现堆栈 class 之后出现的,所以这是我的代码,如果它可以帮助解决问题:

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

编辑:主要提问:

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

您的代码有误:

void push(vertex y)
{
    end++;
    d[end]=y;
}

应该是:

void push(vertex y)
{
    d[end]=y;
    end++;
}

否则,第一个推送的项目会到达位置 1 而不是位置 0

此外,stack::top() returns 下一项,而不是最后推送的:

vertex top()
{
    return d[end];
}

应该是:

vertex top()
{
    return d[end-1];
}

我很确定你的段错误是由于访问了未分配的内存,添加断言让程序在出现问题时通知你,比如:

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

然后,再次 运行,您将看到您在哪里获得断言。

最后,检查vertex复制构造函数是否正常工作,因为pushing/poping做了很多vertex复制,如果这里有问题,可能会导致段错误。