我正在尝试消除我正在制作的二进制搜索树中的任何内存泄漏,因此我制作了一个简单的递归删除方法。这是首先导致
的方法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;
}
这段代码将是Segfault,我不知道为什么。当它调用复制方法时,它只有一个节点,因此它表示head不是按预期的那样是NULL,但是由于某些原因它尝试引用head->left
时会出现段错误。
非常感谢任何帮助。 :)
编辑:我不知道这一点,直到有人回答说出来,但在复制构造函数中,需要先将所有内容初始化为NULL,然后再尝试复制。因此,当我将构造函数更改为以下
时,我的问题已解决(大多数情况下)BST::BST(const BST & other) : root(NULL), size(0){
答案 0 :(得分:2)
第一条评论:如果其他对象有数据,您应该清除副本中的对象数据。如果另一个对象为空,则副本也应该使该对象为空。
第二条评论:我无法从你的问题中得知,但我希望head-> left或head-> right在构造过程中没有正确设置为NULL。无效但不是NULL值将说明超过if (head == NULL)
检查。
答案 1 :(得分:1)
在BST :: copy中,对NULL的检查与调用Clear()时不在同一对象上似乎很奇怪。我没有足够的代码可以肯定地说,但不应该是:
if (root != NULL) {
Clear();
}
然后,您可能还需要检查other.root!= NULL以查找尚未发布的后续代码。
但作为一般规则,Clear()应该可以安全地调用。您只需在Clear()中检查NULL。
答案 2 :(得分:0)
尝试
delete head;
head = NULL;
并确保在构造函数中将left和right设置为NULL。