【问题标题】:C language: Releasing memory of pointers to structC 语言:释放指向结构的指针的内存
【发布时间】:2017-04-07 05:15:47
【问题描述】:

假设我已经声明了一个指向结构的指针并使用这个定义用 malloc() 分配它

typedef struct node {
    int info;
    struct node *next;
} NODE;

然后在代码的某处我声明了两个指向它的指针

NODE *node1, *node2 = NULL;

node1 = malloc(sizeof(NODE));
node2 = node1;

我的问题,我是否应该像人们总是通过 free(node1) 那样使用“free()”来释放 node2。赋值的具体效果是什么node2 = node1;

谢谢。

【问题讨论】:

  • node1 node2。只释放其中一个,不要同时释放,否则会崩溃。
  • free 只知道地址。它不知道你有什么变量,也不关心哪个指向哪个内存地址
  • @Jean-FrançoisFabre。所以你说的是我也可以通过 free(node2) 释放 node1,不是吗?

标签: c pointers struct malloc free


【解决方案1】:

当你这样做时

node1 = malloc(sizeof(NODE));

你有类似的东西

+--------+ +-----------------+ |节点1 | ---> | NODE 结构的内存 | +--------+ +-----------------+

在分配node2 = node1 之后,您将改为:

+-------+ |节点1 | -\ +-------+ \ +----------------------------+ >>-> | NODE 结构的内存 | +-------+ / +----------------------------+ |节点2 | -/ +-------+

换句话说,你有两个指针指向相同的内存。

尝试使用两个指针变量中的任何一个调用 free 将使 两个 指针无效。

【讨论】:

    【解决方案2】:

    你既不释放node1也不释放node2。你释放他们指向的内存。

    考虑到这一点,你应该清楚为什么你应该只调用一次free

    【讨论】:

      【解决方案3】:

      您应该将malloc() 和family 返回的地址传递给free(),以便释放分配的内存。

      在您的情况下,您只是将返回的地址分配给其他指针并在 free 中使用它,这很好。

      你不应该这样做

      node2 = node1;
      node2 = node2 +1;
      
      free(node2);
      

      所以你可以在你的情况下使用其中一个来释放内存

      free(node1)free(node2) 在你的情况下是一样的

      【讨论】:

      • @JamesReal 是的,您可以使用其中之一
      【解决方案4】:

      node1是一个指针,意味着它的值是分配的struct的虚拟内存地址。

      分配node2 = node1 只是复制该地址。

      因此free(node1)free(node2) 是等价的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-23
        • 1970-01-01
        • 2012-12-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多