C ++程序不会在返回时结束

时间:2013-12-21 08:58:03

标签: c++ return

我有问题。当我检测到错误时,我无法退出程序。

int main()
{
    int N,N1;

    cout<<("Zadejte pocet prvku mnoziny A:")<<endl;
    cin>>N;
        if (N<=0 || cin.fail()){
            cout<<("Nespravny vstup.")<<endl;
            return 1;
        }
    int *A=(int *)malloc(sizeof(int)*N); /***********/

    cout<<("Zadejte prvky mnoziny A:")<<endl;
    napln(A,N);

    /************************************************/

    cout<<("Zadejte pocet prvku mnoziny B:")<<endl;
    cin>>N1;
        if (N1<=0 || cin.fail()){
            cout<<("Nespravny vstup.")<<endl;
            return 1;
        }
    int *B=(int *)malloc(sizeof(int)*N1); /***********/

    cout<<("Zadejte prvky mnoziny B:")<<endl;
    napln(B,N1);

    int *C=(int *)malloc(sizeof(int)*((N1>N)? N1:N)); /***********/

    vypis(C,porovnej(A,B,C,N,N1));

    free(A);
    free(B);
    free(C);
    return 0;
}

int napln(int *p,int n){

        int prvek,i,j;

        for (i=0;i<n;i++){
            cin>>prvek; //dodelat kontrolu
            if (cin.fail()){
                cout<<("Nespravny vstup.")<<endl;
                free(p);
                return 1;
            }
            else{
                p[i]=prvek;
                for(j=0;j<i;j++){
                    if (p[i]==p[j]){
                        cout<<("Nespravny vstup.")<<endl;
                        free(p);
                        return 1;
                    }
                }
            }
        }
    return 1;
}

问题是当我调用napln函数一次(在分离的.cpp文件中尝试)它完美地工作(检测到双倍值并退出)但是当我为另一个dyn做同样的事情时。分配内存它不会退出并继续(消息我写入控制台窗口,但程序流程只是继续......)。任何想法如何解决它?

2 个答案:

答案 0 :(得分:1)

我无法理解你的程序中的标识符,但问题是你可以释放两次内存:首先是函数free(p)中的napln,第二个是free(A)和{{在free(B)中的1}}。尽量不要释放函数main中的指针。

答案 1 :(得分:1)

return只会从您当前所在的函数返回。 您可以使用napln函数的返回值,根据返回值从外部决定程序应该结束。例如,你可以让napln返回,假设失败时为1,成功时为0,根据返回值,你可以这样做:

if(!napln(A,N))
   return 1; //return from main

C ++还有例外作为通过返回值控制程序流的替代方法。

或者,您可以使用void exit(int status)函数退出程序,无论您当前的上下文如何,尽管构建代码不是一个很好的做法。

无论如何,代码的结构不是很好。例如,您应该尽量不重复自己并使输入请求成为您的代码的一部分,而不是复制和粘贴它并将A更改为B.