清除二叉搜索树时的 C++ 段错误

标签 c++ segmentation-fault

我试图消除我正在创建的二进制搜索树中的任何内存泄漏,因此我创建了一个简单的递归删除方法。这是首先导致的方法

void BST::copy(const BST& other){

    if (other.root != NULL){
        Clear();

Clear(); 将首先调用 recursiveDelete(root);

void BST::recursiveDelete(BSTNode * head){

    if (head == NULL)
        return;
    recursiveDelete(head->left); 
    recursiveDelete(head->right);
    delete head;
}

这段代码会出现段错误,我不知道为什么。当它调用复制方法时,它只有一个节点,因此它说 head 不是预期的 NULL,但由于某种原因,当它尝试引用 head->left 时会出现段错误。

如有任何帮助,我们将不胜感激。 :)

编辑: 直到一位回答者指出,我才知道这一点,但是在复制构造函数中,需要先将所有内容初始化为 NULL,然后再尝试复制。因此,当我将构造函数更改为以下内容时,我的问题得到了解决(大部分)

BST::BST(const BST & other) : root(NULL), size(0){

最佳答案

第一条评论:如果另一个对象是否有数据,您可能应该清除拷贝中对象的数据。如果另一个对象为空,则拷贝也应使该对象为空。

第二条评论:我无法从你的问题中分辨出来,但我预计 head->left 或 head->right 在构造期间没有正确设置为 NULL。无效但不为 NULL 的值可以解释如何通过 if (head == NULL) 检查。

关于清除二叉搜索树时的 C++ 段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7669500/

相关文章:

c++ - 如何解释 GDB 回溯?

c - 在函数中使用 malloc 的段错误并在另一个函数中使用它

C++ 异步段错误

c++ - shared_ptr 奇怪的行为

c++ - 访问 QTimer 的经过秒数?

c - 如何修复段错误?

c++ - 访问函数的段错误

c++ - SIGSEGV 使用汇编访问数组元素时

c++ - 与竞争特定内存地址(互斥锁暂停另一个)相比,circularBuffer 如何提高性能?

c++ - 重载运算符delete而不重载new时,什么是正确的行为? gcc 和 clang 不同