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

时间:2017-06-21 03:43:12

标签: c++

朋友。所以我使用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函数上指出了一个错误,但我看不到错误。如果你知道如何解决这个问题,请帮助我。 提前谢谢你

3 个答案:

答案 0 :(得分:1)

Certianly是的问题是数据成员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替换),第二个构造函数将使用传递的值初始化它。

答案 1 :(得分:0)

在使用之前,您不会初始化root变量。您可以在构造函数中将其初始化为:

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

答案 2 :(得分:0)

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

BST() {
  root = NULL;
}

根也只能创建一次我们不应该永远改变它。所以改变代码如下

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