我的C ++程序崩溃了这个功能?

时间:2014-03-22 19:36:32

标签: c++

我是一名初学程序员(刚刚开始),我正在为二元搜索树编写一些代码以获得乐趣。 出于某种原因,每当我调用此追加函数时,我的程序就会崩溃。它与两个函数本身之一有关,而不是头文件或包含main()的源文件中的任何其他函数。顺便说一句,Leaf只是一个带有int值的结构,以及两个名为left和right的Leaf指针。

崩溃时没有输出错误。

Leaf* BinarySearchTree::GetLeaf(int x,Leaf*a)
{
 int key = a->value;
 cout <<key<<"\n";
 if(x > key)
 {
  if(a->right == NULL)
  {
   Leaf* newleaf = new Leaf();
   newleaf->value = x;
   a->right = newleaf;
   return newleaf;
  }
 else if (a->right != NULL)
 {
  return a->right;
 }
}
else if(x< key)
{
 if(a->left == NULL)
 {
   Leaf* newleaf = new Leaf();
   newleaf->value = x;
   a->left = newleaf;
   return newleaf;
 }
 else if (a->left != NULL)
 {
   return a->left;
 }
}
else if(x == key)
{
 //tbc
}
}
void BinarySearchTree::Append(int x)
{
  if(root != NULL)
  {
    Leaf* current = root;
    while(current->value != x)
    {
        current = BinarySearchTree::GetLeaf(x,current);
        cout<<"value: "<<
        current->value;
    }
  }
  else
  {
   cout <<" No ROOT!";return;
  }
}

如果您想查看我的主要(来源)文件,请转到此处(因为我不想发布此帖子) http://pastebin.com/vrh7KkMm

如果要查看头文件的其余部分,这两个函数所在的位置, http://pastebin.com/ZGWewPdV

2 个答案:

答案 0 :(得分:1)

在BinarySearchTree构造器中,您首先开始访问root而不为其分配内存。这可能是你的崩溃。尝试添加

root = new Leaf()

在构造函数的开头。

编辑 - 更多信息:

C ++不会自动为您的成员变量设置值,您通常需要手动初始化它们。 (c ++ 11确实允许你在声明中这样做)。这意味着您未设置为值的任何变量都将包含垃圾值。如果您将此垃圾值用作指针,则很可能会崩溃。

在您的情况下,最初的问题之一是LinkedList类在开始引用它之前没有在构造函数中初始化其根成员变量。

BinarySearchTree也存在同样的问题。

学习使用调试器是学习编程时可以做的最好的事情之一。它允许您一次一行地执行代码并查看每个变量的值。这使我很容易看到事情没有按计划进行。您使用哪种调试器取决于您的平台。

答案 1 :(得分:0)

如果使用GetLeaf()调用x == key,则该函数既不返回nullptr也不返回有效指针。这是一个潜在的崩溃源。无论如何,你需要返回一些合理的东西。

更新:不要忘记在其构造函数中正确初始化Leaf结构(所有三个成员)。

UPDATE2:也正确初始化你的root。我会用nullptr初始化它并以一种方式更改append函数,如果root == nullptr,它会创建第一次离开。