我的c++程序在这个函数上崩溃了

My C++ program crashes on this function?

本文关键字:函数 崩溃 c++ 程序 我的      更新时间:2023-10-16

我是一个初级程序员(刚刚开始),我正在为二叉搜索树编写一些代码。由于某种原因,每当我调用这个追加函数时,我的程序就会崩溃。它与两个函数本身之一有关,而不是头文件或包含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

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

root = new Leaf()

在构造函数开头。

编辑-更多信息:

c++不会自动为成员变量设置值,通常需要手工初始化。(c++11允许你在声明中这样做)。这意味着任何未设置值的变量都将具有垃圾值。如果你使用这个垃圾值作为指针,你很可能会崩溃。

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

BinarySearchTree也有同样的问题。

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

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

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

UPDATE2:还要正确初始化您的根。我将用nullptr初始化它,并更改append函数,使其创建第一个leave(如果root==nullptr)