【问题标题】:free pointer by other pointer points same memory其他指针指向相同内存的空闲指针
【发布时间】:2020-12-06 07:28:33
【问题描述】:

下面的代码可以吗?

int *a_p = malloc(sizeof(int));
int *b_p = a_p;
free(b_p);         //Free a_b by using b_p
a_p = b_p = NULL;

我很困惑,因为两个指针指向同一个内存......

如果那个代码是不可能的,请教我为什么?

【问题讨论】:

  • 是的,有可能。
  • 非常感谢!欣赏你!
  • 一些提供指针基本讨论的链接可能会有所帮助。 Difference between char pp and (char) p?Pointer to pointer of structs indexing out of bounds(?)...(忽略标题,答案讨论指针基础知识)
  • 某些带有 void ** 参数的函数可以分配您必须释放的内存。
  • 是的,有可能,两个指针都指向同一个分配的缓冲区,因此它们中的任何一个(但不是两者)都可以用于free()分配的缓冲区。

标签: c pointers


【解决方案1】:

你所拥有的一切都很好。


  1. 您创建a_p,分配一个内存块,并将该块的地址分配给a_p
    int *a_p = malloc(sizeof(int));之后:

    int *a_p                  int @ 0x1234
    +------------+           +------------+
    | 0x1234     |           | ???        |
    +------------+           +------------+
    
  2. 您使用与a_p 相同的值创建b_p
    int *b_p = a_p;之后:

    int *a_p                  int @ 0x1234
    +------------+           +------------+
    | 0x1234     |           | ???        |
    +------------+           +------------+
    
    int *b_p
    +------------+
    | 0x1234     |
    +------------+
    

    值得注意的是,除了b_p 本身之外,它没有分配任何内存。

  3. 您释放了之前分配的内存块。
    free(b_p);之后:

    int *a_p
    +------------+
    | 0x1234     |
    +------------+
    
    int *b_p
    +------------+
    | 0x1234     |
    +------------+
    
  4. 您会覆盖地址。
    a_p = b_p = NULL;之后:

    int *a_p
    +------------+
    | NULL       |
    +------------+
    
    int *b_p
    +------------+
    | NULL       |
    +------------+
    

剩余的两个块(a_pb_p)具有自动存储期限,所以当函数返回时它们会被自动释放。

【讨论】:

    【解决方案2】:

    指针是值。它们可以通过赋值复制。

    在本例中,b_p 设置为 a_p 的值,然后调用 free(b_p);

    此时,b_p 中的值是 a_p 中的 1,这是从 malloc() 返回的指针,尚未释放。因此,这是有效的。

    另一种可能是malloc()失败并返回NULL,但free(NULL);是有效的并且被定义为什么都不做,所以在这种情况下代码也是有效的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多