You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MacBook升级Sonoma14.0后BST程序出现Bus Error求助

修复二叉搜索树(BST)的Bus Error问题

问题描述

升级MacBook到Sonoma 14.0后,原本正常运行的C++二叉搜索树程序出现Bus Error,调试显示崩溃在构造函数第一行rootNode->data = '\0'。

错误原因

rootNode是未初始化的指针,直接访问rootNode->data属于访问未分配的内存空间,属于C++未定义行为。之前系统可能恰好让指针指向了一块可访问的内存(比如零页),但Sonoma的内存布局或安全机制变化,导致现在触发了Bus Error。

修复方案

核心思路

将rootNode初始化为nullptr,插入元素时再动态创建根节点,避免直接操作未初始化的指针。

修复后的完整代码

#include <iostream>

template<typename Char> class BST {
public:  
    struct Node {
        Char data; 
        Node* left;
        Node* right;
    };
    Node* rootNode;

    // 构造函数:初始化rootNode为nullptr
    BST() : rootNode(nullptr) {}

    // 适配模板参数,避免类型不匹配
    Node* createNode(Char ch) {
        Node* nn = new Node;
        nn->data = ch;
        nn->left = nullptr;
        nn->right = nullptr;
        return nn;
    }

    // 适配模板参数
    void insert(Char myChar) {
        insertHelper(rootNode, myChar);
    }

    void inOrderTraversal() {
        inOrderTraversalHelper(rootNode);
    }

    void preOrderTraversal() {
        preOrderTraversalHelper(rootNode);
    }

    void postOrderTraversal() {
        postOrderTraversalHelper(rootNode);
    }    

private:
    // 重构插入逻辑:判断节点是否为空而非data值
    void insertHelper(Node* &root, Char ch) {
        if (root == nullptr) {
            root = createNode(ch);
        } else if (ch < root->data) {
            insertHelper(root->left, ch);
        } else if (ch > root->data) {
            insertHelper(root->right, ch);
        }
        // 相等元素默认忽略,符合BST常规逻辑
    }

    void inOrderTraversalHelper(Node* node) {
        if (node != nullptr) {
            inOrderTraversalHelper(node->left); 
            std::cout << node->data << " ";           
            inOrderTraversalHelper(node->right); 
        }
    }

    void preOrderTraversalHelper(Node* node) {
        if (node != nullptr) {
            std::cout << node->data << " ";           
            preOrderTraversalHelper(node->left);  
            preOrderTraversalHelper(node->right); 
        }
    }

    void postOrderTraversalHelper(Node* node) {
        if (node != nullptr) {
            postOrderTraversalHelper(node->left); 
            postOrderTraversalHelper(node->right);
            std::cout << node->data << " ";          
        }
    }

    // 添加析构函数,避免内存泄漏
    ~BST() {
        deleteTree(rootNode);
    }

    void deleteTree(Node* node) {
        if (node != nullptr) {
            deleteTree(node->left);
            deleteTree(node->right);
            delete node;
        }
    }
};

int main () {
    BST<char> cisp_bst; 
    cisp_bst.insert('k');
    cisp_bst.insert('e');
    cisp_bst.insert('v');
    cisp_bst.insert('b');
    cisp_bst.insert('g');
    cisp_bst.insert('p');
    cisp_bst.insert('y');

    std::cout << "\nIn order traversal: ";
    cisp_bst.inOrderTraversal();
    std::cout << "\n\n";
    std::cout << "Post-order traversal: ";
    cisp_bst.postOrderTraversal();
    std::cout << "\n\n";
    std::cout << "Pre-order traversal: ";
    cisp_bst.preOrderTraversal();
    std::cout << "\n\n";

    return 0;
};

关键修改点

  1. 构造函数初始化:用成员初始化列表将rootNode设为nullptr,避免未初始化指针操作
  2. 模板参数一致性:将createNode、insert等函数的参数类型改为模板参数Char,避免类型不匹配问题
  3. 插入逻辑重构:判断节点是否为空来创建新节点,而非依赖data == '\0'的标记
  4. 内存泄漏修复:添加析构函数和递归删除节点的方法,释放动态分配的内存
  5. 移除using namespace std;:避免命名冲突,规范使用std::前缀

内容的提问来源于stack exchange,提问作者densohz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 12:10:53