c++ - pop() 中没有 free() 的链表

标签 c++ stack singly-linked-list

我浏览了很多单向链表的例子,它作为堆栈工作。它们有以下共同点:它们总是在 pop() 函数中对弹出的项目使用 free,例如:

struct Node  
{  
 struct Node *Next;  
}*Head;  

void pop()  
{  
 struct Node *cur_ptr=Head;  
   ....
   Head = Head->Next;
   // do something with cur_ptr
   free(cur_ptr);  
   ....
 }   

我是否总是需要使用该规则?我可以在弹出功能中没有免费项目的情况下从列表中弹出项目吗? 我想要实现的是在程序启动时只分配一次列表,并避免在每次调用 pop、push 函数时取消分配和分配内存。我想要弹出项目,使用项目并再次将其推送(在程序的其他部分)以列出以供重用。 这种方法有什么问题吗?

非常感谢您的意见和帮助。

最佳答案

您必须确保在不再需要时释放分配的内存,这就是重点。

如果有任何机会,您丢失了对动态分配地址的引用而没有释放它,那么您将发生内存泄漏,嗯:

void pop() {
  // get element from stack
  // use it
  // not call free
}

如果您不在任何地方存储弹出项目的地址,这将产生泄漏。

如果你想重用分配的项目,那么你可以自由地这样做,在这种情况下你不应该释放它们,例如:

  void push() {
    struct Node *ptr = pop_unused_node();
    if (!ptr) // if no unused node is found then we need a new one
      ptr = malloc(sizeof(struct Node));
    *ptr = data;
    push(ptr);
  }

  void pop() {
    struct Node *ptr = pop();
    // use data
    push_unused_node(ptr);
  }

  void clearup() {
    for each node in unused list
      free(node);
    for each node in stack
      free(node);
  }

关于c++ - pop() 中没有 free() 的链表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20954530/

相关文章:

java - 堆栈 - 未经检查/不安全的操作

c - 此函数返回一个列表,其中包含出现在列表 "A"中 "pos_list"给定位置的值

c++ - 检查单链表是否为空c++

c++ - 如何制作 std::function 实例

c++ - 使用空参数包显式调用可变函数模板

c - 如何用 C 语言实现包含 PIC 函数调用的堆栈

c++ - 我试图按升序将两个链表合并为 1 个链表

C++14 逐字提取带引号的字符串,包括引号

c++ - 执行 "delete this"时缺少虚拟析构函数

java - Java 堆栈实现了什么类型的数据以及它如何对每种类型进行计算?