EXC_BAD_ACCESS 在二叉树构造函数中
EXC_BAD_ACCESS in binary tree constructor
我正在编写一个程序来演示二叉树的工作原理,它有点像 20 个问题,但它在最后添加了新问题,等等。
我已经记下了大部分内容,代码可以编译,但是当我尝试执行它时它给我错误 "EXC_BAD_ACCESS" (In Xcode)。
这是我的 main.cpp 初始化树的摘录:
std::string firstSubjectGuess = "rabbit";
tree guessTree(firstSubjectGuess);
我的头文件的顶部创建节点结构并声明 constructor/deconstructor:
struct node
{
std::string question;
std::string subject;
node *yes = NULL;
node *no = NULL;
};
class tree
{
public:
//tree();
tree(std::string subject);
~tree();
然后树的构造函数class:
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;
在 class 文件中。但是,如果我将 main.cpp 更改为直接获取字符串而不是变量
(即
tree guessTree("rabbit");
) 我在
行收到错误
root->yes = NULL;
我希望我只是忽略了一些简单的事情,因为它通常就是这样。
node *root;
您声明了此指针,但忘记使用 new
实际初始化它。
每个自尊的 C++ 编译器都会大声警告您使用未初始化的变量。如果您收到来自编译器的警告,那么在尝试编译时,请将其作为一种学习经验:永远不要忽略来自编译器的警告。编译代码时你应该得到的唯一输出是:什么都没有。只有生成的目标文件。
您的编译器显然无法捕获代码中的所有逻辑错误,但它可以捕获一些明显的错误。如果您没有收到编译器的警告,请阅读其文档并找出哪些编译器选项会打开警告消息。
我正在编写一个程序来演示二叉树的工作原理,它有点像 20 个问题,但它在最后添加了新问题,等等。
我已经记下了大部分内容,代码可以编译,但是当我尝试执行它时它给我错误 "EXC_BAD_ACCESS" (In Xcode)。
这是我的 main.cpp 初始化树的摘录:
std::string firstSubjectGuess = "rabbit";
tree guessTree(firstSubjectGuess);
我的头文件的顶部创建节点结构并声明 constructor/deconstructor:
struct node
{
std::string question;
std::string subject;
node *yes = NULL;
node *no = NULL;
};
class tree
{
public:
//tree();
tree(std::string subject);
~tree();
然后树的构造函数class:
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;
在 class 文件中。但是,如果我将 main.cpp 更改为直接获取字符串而不是变量
(即
tree guessTree("rabbit");
) 我在
行收到错误 root->yes = NULL;
我希望我只是忽略了一些简单的事情,因为它通常就是这样。
node *root;
您声明了此指针,但忘记使用 new
实际初始化它。
每个自尊的 C++ 编译器都会大声警告您使用未初始化的变量。如果您收到来自编译器的警告,那么在尝试编译时,请将其作为一种学习经验:永远不要忽略来自编译器的警告。编译代码时你应该得到的唯一输出是:什么都没有。只有生成的目标文件。
您的编译器显然无法捕获代码中的所有逻辑错误,但它可以捕获一些明显的错误。如果您没有收到编译器的警告,请阅读其文档并找出哪些编译器选项会打开警告消息。