首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

delete 和NULL的有关问题

2012-12-15 
delete 和NULL的问题二叉树中删除一个节点,让其父节点指向其子节点,然后释放该节点,相关代码如下://当只有

delete 和NULL的问题
二叉树中删除一个节点,让其父节点指向其子节点,然后释放该节点,相关代码如下:
//当只有一个子节点

BSTNode* temp=t;//t为父节点
if(t->left==NULL)
   t=t->right;
else
   t=t->left;
delete temp;
这样会内存泄漏,这是为什么呢?
[最优解释]

if(t->left==NULL)//
   t=t->right;
else
   t=t->left;//
delete temp;//
当删除掉一个temp的时候,也就是t在他的左右孩子上了,到这一步是可以的,你再进行下一步的时候,temp是个野指针了,你再继续delete的时候,必须会崩掉,你做一个野指针进行了非法操作!

[其他解释]
引用:
引用:delete要和new配对,我好像没有看到new啊,你delete什么啊。
BSTNode* temp=t;//t为父节点
这句话等效new吧


不等效。
new 与 delete成对使用。


BSTNode* temp=t;//t为父节点

申请的指针,会在函数结束后,程序自动释放,回收。无需手动删除!
delete temp;
多此一举。
就这。
[其他解释]
6楼说的不对,按照二叉树的定义,a、b、c、d的关系是a<b<c<d,把它们按照二叉树存储的结果应该都在右子树(左<父<右),而按照楼主的说法,是不会有左右子树都存在的情况,具体是什么原因,建议楼主交出二叉树删除、添加、定义部分的原代码!
[其他解释]
刚才没有把问题说清楚。上面的代码运行本身不会有内存泄漏。但是比如说这样:
bst.insert("a");
bst.insert("b");
bst.insert("c");
bst.insert("d");
bst.remove("a");
cout<<bst.root->name<<endl;
就会内存泄漏。
如果不进行delete temp的操作,
cout<<bst.root->name<<endl;可以正确输出b。
为什么删除temp会有问题呢?那个是原来a占用的空间,释放了应该没事啊,不懂了,求大神解释
[其他解释]
delete要和new配对,我好像没有看到new啊,你delete什么啊。
[其他解释]
二叉树是不能直接删除结点的,因为它不是线性的数据结构,你删除结点时,如果左子树不存在,删除右结点不会出现问题,右子树不存在,删除左子树也不会出现问题,但如果左右子树都存在,普通的删除总会造成同父结点的另一颗树产生内存泄漏,如果要强制删除,可以设定标志位,然后把除它以外的树进行重新排列(拷贝二叉树),在把原二叉树全部删除,如果你怕麻烦,那就直接设定标志位好了,然后不显示设置了标志位的那个结点。 
[其他解释]
引用:
delete要和new配对,我好像没有看到new啊,你delete什么啊。

BSTNode* temp=t;//t为父节点
这句话等效new吧
[其他解释]
搞好逻辑关系,你删除一个节点指向子节点,无论你指向左子节点还是右子节点,另一边谁来控制。怎么才能找到他,找不到就是更大的内存泄露了。
[其他解释]
我希望看到你的全部原代码
[其他解释]
t是函数的形参,类型是BSTNode*?
如果是这样
t = t->right; 并没有改变实参的值,只是修改了形参的值

所以bst.root还是指向"a"节点,并没有只想"b".
[其他解释]
引用:
t是函数的形参,类型是BSTNode*?
如果是这样
t = t->right; 并没有改变实参的值,只是修改了形参的值

所以bst.root还是指向"a"节点,并没有只想"b".

t是引用参数
[其他解释]
引用:
6楼说的不对,按照二叉树的定义,a、b、c、d的关系是a<b<c<d,把它们按照二叉树存储的结果应该都在右子树(左<父<右),而按照楼主的说法,是不会有左右子树都存在的情况,具体是什么原因,建议楼主交出二叉树删除、添加、定义部分的原代码!


现在这个问题已经解决了,不好意思,你说的对,应该看其他代码,这个地方出错我只纠结这里,是其他代码引发的原因。多谢啦!

热点排行