释放指针后分配给指针
Assigning To Pointer After Freeing It
我正在看《暴露的编程面试》一书中的以下代码:
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将比在一个地方崩溃更困难。
请不要认为释放的指针永远不会在您的代码中被取消引用。如果一个项目维护很长时间,那么就有可能错误地添加(或修改(代码。
- 将指针分配给另一个指针时会发生什么情况?
- C++将一个指针分配给另一个指针时执行的类型检查
- 我似乎无法为指针分配一个数组,然后更改数组的内容
- C++为 void 指针分配一个字符串
- 当我在 C++ 中将派生类的指针分配给指针时,地址会更改
- MPI 集合通信中的指针分配
- 函数指针分配在创建 DLL 后导致错误
- 通过双指针分配指针
- C++编译时使用 constexpr 字符数组指针分配静态数组?
- 我可以直接为指针分配地址吗?如果是,如何做到这一点
- 为什么为char指针分配内存不会截断char序列
- C++指针分配字符数组的地址
- 将 void 指针分配给另一个 void 指针
- 如何将不同的成员函数指针分配给注册类的不同实例?
- 如何为指针分配特定的内存地址?
- C++ - 无法将顶部常量指针分配给另一个非常量指针
- 将指针分配给另一个指针时会发生什么情况?
- 为指向C++中的对象/对象的指针分配堆内存
- 将指针分配给字符串变量中包含的地址
- 当直接分配时,为什么此功能指针分配起作用,而不是与有条件的操作员一起使用