[英]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.