gpt4 book ai didi

c++ - 尝试删除二叉树中的节点时双重释放或损坏(out)

转载 作者:行者123 更新时间:2023-11-30 05:20:23 25 4
gpt4 key购买 nike

我正在尝试创建一个递归函数来删除二叉树中的所有节点,其中 p->left 和 p->right 是指向树中下一层的指针。但是它给出了以下错误消息:

* `./test.out' 中的错误:双重释放或损坏(输出):0x00007ffdf0cb3650 *

struct Node {
int key;
double data;
Node * right;
Node * left;
};

void delete_tree(Node * & p){
if (p->left){
delete_tree(p->left);
}
if (p->right){
delete_tree(p->right);
}
delete p;
};

int main(){
Node * currentNod = new Node;
currentNod->key = 5;
Node * newNode = new Node;
newNode->key = 3;
Node * newNode2 = new Node;
newNode2->key = 6;
delete_tree(currentNod);
std::cout << currentNod->key << "\n";
std::cout << newNode->key << "\n";
std::cout << currentNod->left->key << "\n";
return 0;

我已经在线搜索并意识到当您使用带指针的递归函数时可能会出现问题,但是 delete_tree 需要一个引用,而不是一个拷贝,所以这个问题不应该适用于这里?我不明白为什么它不起作用:(

编辑:更改了代码,问题是当我初始化 currentNod 时,我首先创建了一个 Node 对象,然后我让 currentNod 成为指向该对象的指针。当我改为像这样初始化它时,它起作用了。但是,它没有打印出我所期望的。这打印:

03个段错误

当我希望它立即给出段错误时。有谁知道现在可能是什么问题?谢谢 :)

最佳答案

将其重铸为析构函数会更有意义:

class Node {
public:
// some constructor, methods, ...
// destructor
~Node();
private:
int key;
double data;
Node * right;
Node * left;
};

Node::~Node(){
delete left;
delete right;
left = right = nullptr; // see note below
};

然后您需要做的就是delete node; 任何您想删除树的地方。但是如果它是一个子树,你还需要确保父节点指向这个节点的指针也为空,这样你就不会重复删除。

关于c++ - 尝试删除二叉树中的节点时双重释放或损坏(out),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40658726/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com