奇怪的分段错误错误

时间:2010-11-13 20:56:11

标签: c++ segmentation-fault binary-tree

好的,所以我正在完成一项任务并为了我的生活,我无法弄清楚为什么我会遇到这些分段错误。我仍然在学习c ++,编程一般,所以我希望有人比我更聪明可以帮助我。该程序是一个自组织的二叉搜索树,直到现在我并没有太多困难。这是我用来测试我的班级BST的主程序的开始,我不能改变mian程序,因为它是一个赋值。

int main() {
string input;

// get a list of integer values
cout << "Enter a list of integer values in one line: ";
getline(cin, input);

cout << "\n**CHECKPOINT 1**\n";

// create a binary search tree
BST<int> bst1(input);


if (!bst1.empty()) {
    cout << "\n**CHECKPOINT 2**\n";
    cout << "Inorder traversal: ";
    bst1.printInOrder();
    cout << "Level order traversal: ";
bst1.printLevelOrder();

我还没有通过printInOrder()函数,这是

的代码
template <typename T>
void BST<T>::printInOrder(BSTNode* t) const
{
    if (t->left != NULL)
        printInOrder(t->left);
    std::cout << " " << t->data << " ";
    if (t->right != NULL)
        printInOrder(t->right); 
}

当我添加一个快速的cout&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;对于printInOrder函数的第一行的“Something”,它的所有内容都将是打印行

cout << "Inorder traversal: ";

它还将开始打印树中的一些数字,最后再次给我一个分段错误。 :/

所以,如果有人能向我解释WTF正在进行中,我将非常感激。增加或减少一个简单的cout线不应该改变这样的事情吗?此外,我觉得有更好的方法来调试这个,如果有人有他们用来计算这些东西的技术,请分享:)提前谢谢!

编辑:我已经尝试过调试器GDB,我无法弄明白,但是我再也不是很熟悉调试器的高级功能,所以我可能错过了一些东西。 唯一运行的其他函数是从字符串输入构建的构造函数。从我从调试器中可以看出,构造函数似乎工作正常,但仍然是代码

template <typename T>
BST<T>::BST(const std::string input, int th)
{
    threshold = th;
    root = NULL;        
    T v;
    // Make Input String Stream for easy use of >> operator
    std::istringstream iss (input);
    do
    {
        iss >> v;
        insert(v, root);
    }while(iss.good());
}

EDIT2:

这是我的插入功能的代码,感谢大家的帮助! :)

template <typename T>
void BST<T>::insert(const T& v, BSTNode *&t)
{
    if(t == NULL)
        {
            t = new BSTNode;
            t->left = NULL;
            t->right = NULL;
            t->data = v;
            t->searchCount = 0;
        }
    else if( v < t->data )
        insert(v, t->left);
    else
        insert(v, t->right);
}

3 个答案:

答案 0 :(得分:1)

输出中明显缺少换行符。线缓冲通常意味着在遇到换行符之前您没有看到任何内容。

我将PrintOnOrder之后的行修改为: -

    cout << "\nLevel order traversal: ";

答案 1 :(得分:0)

在构造函数中,即使读取v的数据失败,您也会将iss >> v插入树中。可能你更想要这样的东西:

while (iss >> v) {
   insert(v, root);
}

但是,您的分段错误的真正原因可能在于insert(),例如,如果该函数只是插入指向它接收到树中的(堆栈已分配)参数的指针。参数变量将超出函数末尾的范围(因此不再存在)。如果你只是将一个指向该变量的指针存储到树中,那么该指针将不再指向任何有用的东西。

答案 2 :(得分:0)

我在这里看不出任何错误。正如其他人指出的那样,输出缓冲可能意味着您的代码实际上成功完成了printInOrder(),然后在某个地方崩溃。