需要帮助修复分段错误(核心转储)

Need help fixing a segmentation fault (core dumped)

本文关键字:核心 转储 错误 分段 帮助      更新时间:2023-10-16

friends.所以我使用 vim 作为我的编辑器在 ubuntu 中创建了一个二叉搜索树类,当我运行我的程序时,我总是收到分段错误(核心转储(错误。奇怪的是,当我在 NetBeans 上运行这个程序时,它运行得很好。这是我的代码

#include <iostream>
using namespace std;

class BST
{
struct node {
    int data;
    node* left;
    node* right;
};

private:
node* root;

node* addHelper(node* temp, int data)
{
    if(temp == NULL)
    {
       temp = new node;
       temp->left = temp->right = NULL;
       temp->data = data;
       return temp;
    }
    if(data < temp->data)
    {
    temp->left = addHelper(temp->left, data);
    }
    else if(data > temp->data)
    {
    temp->right = addHelper(temp->right, data);
    }
    return temp;
}
void printHelper(node* cur)
{
   if(cur == NULL)
   {
       return;
   }
   else {
        printHelper(cur->left);
        cout << cur->data << " ";
        printHelper(cur->right);
   }
}

public:
void add(int value)
{
   root = addHelper(root, value);
}

void printInorder()
{
    printHelper(root);
}

};
int main()
{
   cout << "Second Test, linux runnning sucsesfully"<<endl;
   BST mytree;
   mytree.add(20);
   mytree.add(25);
   mytree.add(10);
   mytree.add(22);
   mytree.add(15);
   mytree.add(12);
   mytree.add(23);
  mytree.printInorder();
  return 0;
}

我已经使用 gdb 进行调试,它指出了 printHelper 函数上的错误,但我看不到错误。 如果您知道如何解决此问题,请帮助我。提前谢谢你

当然是的,问题是使用root的数据成员而不是初始化

问题的解决方案

public:
BST(){
  root = new node();
}

如果用例需要在构造函数中进行更多操作,您还可以使用初始值设定项列表,这在可读性方面很好。只是一个附加组件,您应该始终使用初始值设定项列表初始化constreference

或使用初始值设定项列表

public:
BST(node* root):root(root){
    //Any other initialization /Operation
}

或者给它一个 NULL(或 nullptr,在最新的 C++ 标准中(。

public:
BST() : root(NULL) { }

我们这里的默认 ctor 使其为 NULL(如果需要,请替换为 nullptr(,第二个构造函数将使用传递的值对其进行初始化。

在使用 root 变量之前,您不会对其进行初始化。可以在构造函数中对其进行初始化,如下所示:

public:
BST(){
  root = new node();
}

修复只是将根初始化为 NULL 。[不要在那里分配任何东西。构造函数必须如下所示

BST() {
  root = NULL;
}

此外,根只能创建一次 我们不应该永远改变它。因此,请更改如下所示的代码

if (root == NULL) {  
     root = addHelper(root, value);  
   } else {  
     addHelper(root, value);  
   }