释放指针后分配给指针

Assigning To Pointer After Freeing It

本文关键字:指针 分配 释放      更新时间:2023-10-16

我正在看《暴露的编程面试》一书中的以下代码:

bool deleteStack( Element **stack ){
      Element *next;
      while( *stack ){
            next = (*stack)->next;
            free( *stack );
            *stack = next;
      }
      return true;
}

我对C++或C不太熟悉,所以这可能是一个愚蠢的问题,但在释放指针后给它赋值不会引起问题吗?

在您的示例中,*stack是一个指针。释放它所指向的内存,然后将指针分配给一个新变量,这是非常安全的。

唯一不安全的是在释放*stack之后取消引用它

free( *stack );
next = (*stack)->next;

将是不正确的,因为*stack所指向的内存在free调用后具有不可预测的内容(您的进程甚至可能无法访问(。

不,没关系。这样做实际上不会"释放指针":

 free( *stack );

但是您释放了指针CCD_ 5所指向的一些动态分配的内存。当你这样做:

*stack = next;

你让指针指向不同的内存块,仅此而已。

这样做是安全的。当你看到像(*stack)这样的东西时,你可以把它想象成"堆栈指向的"。由于free需要一个指向内存位置的指针,因此您正在从进程虚拟内存中释放堆栈指向的"内存插槽"。这意味着内存地址(即指针(的空间仍然可用,您可以重复使用它。
此外,我认为这可能很有用,当你使用箭头符号->时,你在C/C++中使用了两种不同的符号,这两种符号被简化为通用符号。所以,这个:stack->next和这个:(*stack).next是一样的祝你好运

在释放后将NULL分配给指针变量只是为了在代码中保留一个提示,以确定释放的地址是否发生了解引用。

如果我们不将NULL分配给释放的指针,那么如果我们解除对释放的指针变量的隔离,则行为是未定义的(50%的崩溃几率和剩余的堆损坏几率(。但如果它是NULL设置的,它肯定会崩溃。如果堆被破坏,那么识别bug将比在一个地方崩溃更困难。

请不要认为释放的指针永远不会在您的代码中被取消引用。如果一个项目维护很长时间,那么就有可能错误地添加(或修改(代码。