2016-07-30 87 views
0

我正在写一个应该演示如何树工作的二进制程序,它有点像20层的问题,但它在最后增加了新的问题,等等。EXC_BAD_ACCESS二叉树构造

我有最它的代码将会被编译,但是当我尝试执行它时,它给了我错误“EXC_BAD_ACCESS”(在Xcode中)。

下面是从我的main.cpp的摘录初始化树:

std::string firstSubjectGuess = "rabbit"; 
tree guessTree(firstSubjectGuess); 

我的头文件中创建的节点结构,并宣布构造/析构的顶部:

struct node 
{ 
    std::string question; 
    std::string subject; 
    node *yes = NULL; 
    node *no = NULL; 
}; 

class tree 
{ 
public: 
    //tree(); 
    tree(std::string subject); 
    ~tree(); 

然后树类的构造函数:

tree::tree(std::string subject){ 
    node* root; 
    root->yes = NULL; 
    root->no = NULL; 
    root->question = "Are you thinking of " + getAOrAn(subject[0]) + " " + subject + "?"; 
    root->subject = subject; 
    this->root = root; 
    cursor = root; 
} 

在当前状态下,我得到在线的错误

root->subject = subject; 

在类文件中。但是,如果我改变main.cpp中采取串,而不是直接的变量

(IE

tree guessTree("rabbit"); 

)我在该行得到的错误

root->yes = NULL; 

我希望这是一些简单的东西,我只是俯视,因为这是通常的情况。

+1

您的构造函数调用*未定义的行为*。 'root'是不确定的。它从来没有被授予一个有效的节点地址,但你可以反复引用它。不相关的,我强烈建议不要将本地自动变量命名为成员。是的,你可以,但这并不意味着你*应该*。 – WhozCraig

+0

感谢您的提示。我将确保切换这些变量的命名。 – link270

回答

2
node *root; 

你声明了这个指针,但忘了用new实际初始化它。

每个自我尊重的C++编译器都会大声警告您使用未初始化的变量。如果您收到编译器的警告,尝试编译时请将其作为学习体验:不要忽略编译器的警告。编译代码时唯一应该得到的结果是:什么都没有。只有生成的目标文件。

你的编译器显然不能捕捉到你的代码中的每个逻辑错误,但它可以捕捉到一些明显的错误。如果您没有收到编译器的警告,请阅读其文档并找出哪些编译器选项会打开警告消息。

+0

就像我想的那样,我觉得很愚蠢的事情可以忽略。谢谢你的好回答!我的编译器没有发出警告,否则我肯定会发现它。我一定会听取您的建议并进行调查,看看是否有一些选择可以改变,以便更宽松地显示警告。注意:我通过声明root来解决这个问题。节点* root =新节点; – link270