c++ - 奇怪的段错误

标签 c++ segmentation-fault binary-tree

好吧,我正在做一项作业,但我终其一生都无法弄清楚为什么会出现这些段错误。我仍在学习 C++,一般来说是编程,所以我希望比我聪明的人能帮助我。该程序是一个自组织的二叉搜索树,直到现在我都没有遇到太大的困难。这是我用来测试我的类(class) 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); 
}

如果当我在 printInOrder 函数的第一行添加一个快速 cout<< "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());
}

编辑 2:

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

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);
}

最佳答案

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

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

    cout << "\nLevel order traversal: ";

关于c++ - 奇怪的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4174651/

相关文章:

c++ - 获取指向非静态成员函数的函数指针

c++ - 使用 C++ 在 Windows 上连接到 MySQL 数据库在一般异常下连接失败,分配错误

C++模板中函数指针的c++错误C2064

algorithm - 二叉搜索树的删除过程

C++ 二叉树打印节点

c++ - 在不使用 GLSL 的情况下迁移到最新的 OGL

C - 教授测试代码中的段错误

c - 打印链表会导致 C 程序出现段错误

c - 仅在不使用调试器时出现段错误

Python 从递归 DFS 返回一个元素