【发布时间】:2017-12-10 14:49:49
【问题描述】:
#include <iostream>
using namespace std;
struct node{
int val;
node* left, *right;
};
void _delete(node *root)
{
root = NULL;
}
void change(node *root)
{
root->val = 6;
}
int main()
{
node * root = new node;
root->val = 5;
change(root);
_delete(root);
cout<<root->val<<endl;
return 0;
}
上面程序的输出是6。似乎_delete函数对根节点没有影响,但change函数对根节点有影响。就好像delete 将传递的参数视为局部变量,而change 将参数视为全局变量。有什么我遗漏的或者这是正常的吗?如果正常,请说明。
【问题讨论】:
-
"好像_delete函数对根节点没有影响" 确实没有。为什么你认为应该? “更改将参数视为全局变量”不,它没有。它改变了
root->val。root仍然是本地的。 -
@Downvoters,这显然是用可编译的示例编写的。请不要以显而易见的理由投反对票。
-
您的代码也会泄漏内存,因为它没有释放使用运算符
new分配的对象。将指针设置为其他值不会释放指针指向的对象。如果_delete应该将指针设置为NULL,那么您稍后在cout<<root->val<<endl;中取消引用NULL指针。 PS:下划线开头的名字在C++中是保留的。 -
您应该使用运算符
delete删除节点的内存,然后将指针设置为空。否则,程序分配了内存,但它的位置将丢失,您将无法恢复它,也就是 内存泄漏。
标签: c++ pointers binary-tree