导致运行时错误的析构函数
Destructor causing runtime error
我正在使用 Trees 进行练习。目前精确的二叉搜索树。我有一个通用的 Tree
class 用来解决 BST 问题。
所以,我遇到了一个问题 tp convert the given tree (BST) into a Doubly linked list.
我能够成功地将树转换为 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不打印输出,不知道为什么!)
这里的问题是您正试图删除发起链式破坏的邻居。您将必须添加一个标志,您可以在析构函数中检查哪个邻居可以正常删除。
~Node() {
_isDestructing = true;
if (!left->_isDestructing) delete left;
if (!right->_isDestructing) delete right;
left = NULL;
right = NULL;
}
我正在使用 Trees 进行练习。目前精确的二叉搜索树。我有一个通用的 Tree
class 用来解决 BST 问题。
所以,我遇到了一个问题 tp convert the given tree (BST) into a Doubly linked list.
我能够成功地将树转换为 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不打印输出,不知道为什么!)
这里的问题是您正试图删除发起链式破坏的邻居。您将必须添加一个标志,您可以在析构函数中检查哪个邻居可以正常删除。
~Node() {
_isDestructing = true;
if (!left->_isDestructing) delete left;
if (!right->_isDestructing) delete right;
left = NULL;
right = NULL;
}