【问题标题】:C++ - Setting a node to NULL doesn't work [duplicate]C ++ - 将节点设置为NULL不起作用[重复]
【发布时间】: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-&gt;valroot 仍然是本地的。
  • @Downvoters,这显然是用可编译的示例编写的。请不要以显而易见的理由投反对票。
  • 您的代码也会泄漏内存,因为它没有释放使用运算符new 分配的对象。将指针设置为其他值不会释放指针指向的对象。如果_delete 应该将指针设置为NULL,那么您稍后在cout&lt;&lt;root-&gt;val&lt;&lt;endl; 中取消引用NULL 指针。 PS:下划线开头的名字在C++中是保留的。
  • 您应该使用运算符delete 删除节点的内存,然后将指针设置为空。否则,程序分配了内存,但它的位置将丢失,您将无法恢复它,也就是 内存泄漏

标签: c++ pointers binary-tree


【解决方案1】:

由于您在_delete 函数中传递指针按值,因此调用者中的值不会改变。

最快的解决办法是写

void _delete(node*&amp; root)

即通过reference传递指针:注意&amp;;您可能还想在那里的指针上调用delete,否则您会泄漏内存。 change 函数按原样工作,因为您使用的是指向成员的指针 运算符-&gt;

【讨论】:

    猜你喜欢
    • 2020-04-05
    • 1970-01-01
    • 2016-04-01
    • 1970-01-01
    • 2014-11-21
    • 2014-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多