【问题标题】:C++ Delete temporary node in a member function?C ++删除成员函数中的临时节点?
【发布时间】:2015-11-20 19:58:35
【问题描述】:

我正在实现一个类Set,并且有一个成员函数,讽刺地称为member,如果传递的值在集合中,则返回true,否则返回false。我的问题是,如果我正在创建一个临时节点来迭代以搜索此值,我是否需要在完成此临时节点以将内存返回到堆时删除它,因为它不是从函数?

在这个类中,节点作为私有结构嵌入到类 Set 中,如下所示:

private:
  //Precondition: linked list is sorted in ascending order
  struct Node {
     int value;
     Node* link;
  };
  Node* list;
  static Node* cons(int x, Node *p);

我指的功能是:

bool Set::member(int x) const {
   if(list == nullptr) 
      return false;

   Node* tempNode = list;

   while(tempNode != nullptr) {
      if(tempNode->value > x) 
         return false;
      if(tempNode->value == x) 
         return true;
      tempNode = tempNode->link;
   }
   return false;
}

【问题讨论】:

  • tempNode 没有被分配,你将它指向同一个地方 list 指向。
  • 嗯,好吧,我想这遵循了每当使用关键字new时都使用delete的原则,我没有这样做。谢谢
  • 我假设您的 Set 用于分配。作业完成后,如果你想了解更多关于指针和存在的信息,我建议你看一下smart pointers。很多时候(恕我直言,大多数时候)您不必明确使用new/delete
  • 如实说明,我会这样做的。谢谢!!
  • @wendelbsilva,好吧,即使在美丽的新世界中,也有很多情况下您必须明确使用 new

标签: c++ pointers linked-list set


【解决方案1】:

tempNode 只是一个带有automatic storage duration 的非静态局部变量;它的范围仅限于函数的开始和结束。函数返回时自动解除分配

【讨论】:

  • 非静态局部变量有一个明确的名称——它们被称为自动变量。
  • @SergeyA 是的,是的 - 想补充一下,我只是在寻找一个好的参考。
【解决方案2】:

您的member 函数没有分配任何堆内存(没有newmalloc 调用)。 tempNode 变量(大小为sizeof(Node*))将在堆栈上分配。

当函数退出时,整个函数的激活记录(包含tempNode)会被自动释放,所以不需要做进一步的清理。

代码是正确的。

【讨论】:

  • 错了。谁说关于在堆栈上分配的变量?很可能,它不会。什么是“激活记录”?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-18
相关资源
最近更新 更多