[通过释放整个对象来释放链表的节点

问题描述 投票:0回答:1

我将使用链表实现堆栈。此外,我想使用类似模板的东西。因此,我得到了这样的结构:

  1. 节点
#define node(T)            \
  struct node_##T {        \
    T value;               \
    struct node_##T *next; \
  }
  1. 堆栈
#define stack(T)           \
  struct stack_##T {       \
    size_t size;           \
    node(T) * begin, *end; \
  }

最后,我想释放堆栈。我总是使用while /递归来做到这一点。像这样的东西:

while (begin != NULL)
{
    temp = begin;
    begin = begin->next;
    free(temp);
}

就我而言,此方法的使用较复杂,而不是通常的用法。因此,我只是释放对象。

#include "stack.h"
typedef char* string;
int main() {
  stack(string)* a;
  stack_constructor(string, a);
  stack_resize(a, 5);
  free(a);
  return (0);
}

调试显示一切正常。我在“ free(a)”之前和“ free(a)”之后设置了两个断点。before freeingafter freeing但是我对此有些怀疑。我认为我们正在删除为指针分配的内存,但是值仍在内存中。我在作假吗?

c memory-management linked-list
1个回答
0
投票

free(a)释放对象a指向的对象。它不会释放that对象指向的对象。因此它将释放stack对象,但不会释放任何node对象。

© www.soinside.com 2019 - 2024. All rights reserved.