导致运行时错误的析构函数

Destructor causing runtime error

本文关键字:析构函数 运行时错误      更新时间:2023-10-16

我使用Trees是为了练习。当前精确的二进制搜索树。我有一个通用的Tree类,我用它来解决BST问题。因此,我遇到了一个问题,将给定的树(BST(转换为双链表。

我能够成功地将树转换为DLL。但是,问题是当我调用destructor时。由于我正在将内存分配给我的树的节点,我也希望释放内存。这是Tree类的析构函数::

~Tree() {
        delete root;
        root = NULL;
    }

这是Node类的析构函数::

~Node() {
        delete left;
        delete right;
        left = NULL;
        right = NULL;
    }

所以,程序在最后崩溃了!据我所知,由于我编写的析构函数有点递归地删除了树的所有节点,并且当树被转换为DLL时,左右指针确实指向彼此,因此,在调用析构函数的过程中,析构函数试图删除已经删除的节点,而该指针没有设置为NULL。我该如何克服这一点?因为析构函数重载是不允许的。

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

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

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