C++ 释放指针后分配给指针

C++ 释放指针后分配给指针,c++,c,pointers,C++,C,Pointers,我正在看《编程访谈》一书中的以下代码: 我不太熟悉C++或C,所以这可能是个愚蠢的问题,但是在释放它之后不会给指针分配一些东西会引起问题吗?< /P> < P>在你的例子中, *Stuts是一个指针。完全可以安全地释放它指向的内存,然后将指针指定给一个新变量 唯一不安全的事情是在释放堆栈后取消对它的引用 free( *stack ); next = (*stack)->next; 由于*堆栈指向的内存在空闲调用后具有不可预测的内容(您的进程甚至可能无法访问),因此将不正确。不,没有问题。

我正在看《编程访谈》一书中的以下代码:


我不太熟悉C++或C,所以这可能是个愚蠢的问题,但是在释放它之后不会给指针分配一些东西会引起问题吗?< /P> < P>在你的例子中,<代码> *Stuts是一个指针。完全可以安全地释放它指向的内存,然后将指针指定给一个新变量

唯一不安全的事情是在释放堆栈后取消对它的引用

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

由于
*堆栈
指向的内存在
空闲
调用后具有不可预测的内容(您的进程甚至可能无法访问),因此将不正确。

不,没有问题。实际上,您并没有“释放指针”来执行以下操作:

 free( *stack );
但是您可以释放指针
*堆栈所指向的一些动态分配内存。当您这样做时:

*stack = next;

您可以将指针指向另一个内存块,仅此而已。

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

祝你好运

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

若我们不将NULL赋值给释放的指针,那个么若我们解除释放的指针变量的限制,那个么行为是未定义的(50%的几率崩溃,剩余的几率堆损坏)。但如果设置为
NULL
setted,它肯定会崩溃。如果堆被破坏,识别错误将比在一个地方崩溃更困难


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

正如@simonc所说,这里没有错误。释放的不是*stack的内容,而是*stack指向的内存的内容。你的LOC,有规律的变量,没有更多的错误,这样做:a=1;a=0;/*将其视为a*/a=2的free();如果我在C++的采访中得到这个…我会说“为什么没有智能PTR?”你不释放指针。您可以释放指针指向的内容。@PinkElephantsOnParade:如果您正在实现一个容器(如列表),通常不使用智能指针,因为所有权符号通常在容器中定义良好并自包含。自动内存管理容器和智能指针有两种基本形式。@LokiAstari很公平。没有理由在不必要的时候拔出大炮。
这个:stack->next与这个相同:(*stack)。next
-OP实际使用的符号是
(*stack)->next
,因为stack是指向元素的指针,所以OP在使用
->
操作符之前必须遵守。是的,我知道。我只是在解释,因为这可能是他的问题。在开始时不是一个容易阅读的指针,因此我认为完全理解箭头符号可能会有用。不过还是谢谢你。
*stack = next;