析构函数导致运行时错误

时间:2015-07-05 00:45:25

标签: c++ c++11 tree runtime-error

我正在与树木合作,用于练习目的。目前精确二进制搜索树。我有一个通用Tree类,用于解决BST问题。 因此,我遇到了一个问题,即将给定树(BST)转换为双链表。

我能够将树成功转换为DLL。但是,问题在于我打电话给destructor。 因为,我正在为我的树的节点分配内存,我也希望释放内存。 这是Tree class ::

的析构函数
~Tree() {
        delete root;
        root = NULL;
    }

这是Node class ::

的析构函数
~Node() {
        delete left;
        delete right;
        left = NULL;
        right = NULL;
    }

所以,程序最终崩溃了! 据我所知,由于我编写的析构函数有点递归删除树的所有节点,当树转换为DLL时,左右指针确实指向彼此,因此,在调用析构函数时,析构函数尝试删除已删除的节点,并且该指针尚未设置为NULL。 我该如何克服这个问题?因为不允许析构函数重载。

有什么办法可以防止这个运行时错误? 这是代码:: http://ideone.com/SDkXY9 (Ideone没有打印输出,我不知道为什么!)

1 个答案:

答案 0 :(得分:2)

这里的问题是你试图删除发起链式破坏的邻居。您将必须添加一个标志,您可以在析构函数中检查哪个邻居可以删除。

~Node() {
    _isDestructing = true;
    if (!left->_isDestructing) delete left;
    if (!right->_isDestructing) delete right;
    left = NULL;
    right = NULL;
}