【问题标题】:C++ Binary Tree recursive destructor issueC ++二叉树递归析构函数问题
【发布时间】:2017-04-09 02:40:02
【问题描述】:

我制作了一个二叉树类,其中包含: int 值,BinaryTree* leftBinaryTree* right

class BinaryTree {
private:
     int value;
     BinaryTree* left;
     BinaryTree* right;
     bool isVisited;
public:
     BinaryTree();
     BinaryTree createComplete(int n);
     ~BinaryTree();
}

我的析构函数是:

BinaryTree::~BinaryTree() {
delete left;
delete right;   
}

在 clion 中运行时它运行良好,但在我的终端中我得到 段错误(核心转储)。我到处都看到人们声称这应该是析构函数。任何详细说明都会有所帮助!

我不是 stackoverflow 专家,我更新了我的 ~BinaryTree 函数,但仍然出现段错误:

BinaryTree::~BinaryTree() {
if (right != NULL) {
   delete right;
}
if (left != NULL) {
   delete left;
}

}

【问题讨论】:

  • 能否也显示构造函数定义?
  • 如何构建 BST?您能否发布足够的代码以便我们最终重现此问题?

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


【解决方案1】:

所以在调试之后我注意到每个正确的孩子都失去了它的节点,这在进行前序遍历时很好,但是当删除它时出现问题,感谢大家的帮助!

【讨论】:

    【解决方案2】:

    没有看到您的构造函数,我假设您没有将节点的子节点初始化为 NULL。这可能意味着底部叶子的未初始化节点leftright 在其中具有随机值。当析构函数运行时,它会尝试释放节点中随机垃圾指向的内存。

    尝试在 ctoring 节点时将您的子节点初始化为 NULL,然后像 monoceres 建议的那样对其进行检查。在delete 之后设置指向NULL 的指针也很好,以避免错误的双重delete 的情况

    【讨论】:

    • 我确实将节点的子节点初始化为 null。
    【解决方案3】:

    首先,您当前的实现不是完整的树。 它是一个节点,因此我建议将其重命名为 BinaryTreeNode 并使用它来构造一个新的 BinaryTree 类,该类跟踪根并允许您递归地释放树。

    话虽如此,您的析构函数很可能会出现段错误,因为您盲目地尝试删除指针。

    首先确保将左右初始化为 nullptr。 然后你做if(left != nullptr) { delete left }

    【讨论】:

    • 'BinaryTree::~BinaryTree() { if (right != NULL) { delete right; } if (left != NULL) { delete left; } }' 更新了我的文件,仍然有段错误
    • 您确定将它们设置为 NULL 吗?如果您不这样做,它们可能包含垃圾值,并且您的程序可能正在尝试删除不允许触摸的内存
    • 首先我很抱歉,这是我第一次或第二次使用stackoverflow,我确实将它们初始化为NULL。同样,在 CLion 中它工作正常。在终端段错误中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-24
    • 2019-01-18
    • 1970-01-01
    • 2012-10-29
    • 1970-01-01
    相关资源
    最近更新 更多