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

时间:2013-04-14 23:29:14

标签: c++

这是我的代码:

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

当我编译它时,构建成功,但它没有运行,我尝试放一些couts来查看问题所在,问题出在以下几行:

Arbol *ar = new Arbol(); 

当编译器到达该行时崩溃,为什么?

3 个答案:

答案 0 :(得分:3)

你的构造函数访问Raiz-&gt; HijoDerecho-&gt; Padre,但你从未为HijoDerecho分配变量。 Nodo的构造函数将其赋值为NULL。所以你要取消引用空值

答案 1 :(得分:2)

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

Raiz=new Nodo();

这使用Nodo的默认构造函数,将其成员设置为NULL。然后,您尝试取消引用这些成员,例如:

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

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

答案 2 :(得分:1)

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

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

这个课不是你想要的。首先,所有成员都是st​​到NULL。没有为他们分配任何东西。所以这一行及其之后的所有内容都不合法,因为HijoDerecho是null ptr。

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

现在,即使您尝试修复此问题并为此{<1}}分配空间

HijoIzquierdo

这将为新Nodo *HijoIzquierdo = new Nodo (); 中的每个Nodo分配新的HijoIzquierdo。很快你就会失去记忆。

所以问题不只是语义问题。这基本上是一个设计问题。