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; };
关键修改点
- 构造函数初始化:用成员初始化列表将
rootNode设为nullptr,避免未初始化指针操作 - 模板参数一致性:将
createNode、insert等函数的参数类型改为模板参数Char,避免类型不匹配问题 - 插入逻辑重构:判断节点是否为空来创建新节点,而非依赖
data == '\0'的标记 - 内存泄漏修复:添加析构函数和递归删除节点的方法,释放动态分配的内存
- 移除
using namespace std;:避免命名冲突,规范使用std::前缀
内容的提问来源于stack exchange,提问作者densohz
相关产品推荐
相关产品推荐

