繁体   English   中英

C ++运行失败并成功构建

[英]C++ Run Failed and Build Successful

这是我的代码:

#include <iostream>

using namespace std;

class Nodo{
public:
    int valor;
    Nodo *Padre;
    Nodo *HijoIzquierdo;
    Nodo *HijoDerecho;
    Nodo(){
        Padre=HijoIzquierdo=HijoDerecho=NULL;
        valor=0;
    }
};
class Arbol{
public:
    Nodo *Raiz;
    Arbol(){
        Raiz=new Nodo();
        Raiz->valor=5;
        Raiz->HijoDerecho->Padre=Raiz->HijoIzquierdo->Padre=Raiz;
        Raiz->HijoIzquierdo->valor=7;
        Raiz->HijoIzquierdo->HijoIzquierdo->valor=18;
        Raiz->HijoIzquierdo->HijoIzquierdo->Padre=Raiz->HijoIzquierdo;
        Raiz->HijoDerecho->valor=15;
        Raiz->HijoDerecho->HijoIzquierdo->valor=30;
        Raiz->HijoDerecho->HijoIzquierdo->Padre=Raiz->HijoDerecho->HijoDerecho>Padre=Raiz->HijoDerecho;
        Raiz->HijoDerecho->HijoDerecho->valor=8;

    }
    void Arbol::CantidadNodos(Nodo *actual=new Nodo(),int cantNodos){;
        if(actual->HijoDerecho==NULL && actual->HijoIzquierdo==NULL){
            cout<<"El arbol tiene: "<<cantNodos<<" nodos"<<endl;
            return;
        }
        return Arbol::CantidadNodos(actual=actual->HijoIzquierdo,cantNodos++);
    }
};

int main() {
    int opcion;
    Nodo *nodo=new Nodo();
    Arbol *ar = new Arbol();
    cout<<"Ingrese la opcion que desea realizar"<<endl;
    cin>>opcion;
    if(opcion==1){
        ar->CantidadNodos(ar->Raiz,0);
    }
}

当我编译它时,构建成功,但是没有运行,我尝试放置一些提示来查看问题出在哪里,而问题出在以下几行:

Arbol *ar = new Arbol(); 

当编译器到达那一行时,它崩溃了,为什么呢?

Y我们的构造函数访问Raiz-> HijoDerecho-> Padre,但您从未为HijoDerecho分配变量。 Nodo的构造函数将其分配为NULL。 所以您要取消引用空值

Arbol的构造Arbol创建一个新的Nodo对象:

Raiz=new Nodo();

这使用Nodo的默认构造函数,该构造函数将其成员设置为NULL 然后,您尝试使用以下方式取消引用那些成员:

Raiz->HijoDerecho->/* ... */;

取消引用空指针会导致未定义的行为。

您需要修改您的要求 那就是。

class Nodo{
public:
    int valor;
    Nodo *Padre;
    Nodo *HijoIzquierdo;
    Nodo *HijoDerecho;
    Nodo(){
        Padre=HijoIzquierdo=HijoDerecho=NULL;
        valor=0;
    }
};

此类不是您想要的。 首先,所有成员都为NULL。 没有为他们分配任何东西。 因此,此行及其之后的所有内容均不合法,因为HijoDerecho为null ptr。

Raiz->HijoDerecho->Padre=Raiz->HijoIzquierdo->Padre=Raiz;

现在,即使您尝试解决此问题并像这样为HijoIzquierdo分配空间

Nodo *HijoIzquierdo = new Nodo ();

这将为新的Nodo中的每个HijoIzquierdo分配新的Nodo 很快,您将耗尽内存。

因此,问题不只是语义上的。 基本上,这是一个设计问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM