想象一下我有一个链表的结构:
struct node{
int data;
struct node* next;
struct node* prev;
};
我释放了最后一个节点;节点的next
指针是否会自动变为NULL
?
因为我注意到我没有在程序中执行此操作,但是一切正常。
答案 0 :(得分:2)
否。
即使您忘记重置指针,为什么程序仍然可以正常运行,这可能是因为您很幸运。
答案 1 :(得分:1)
当您在malloc()
上调用free()
时,您当然不应该依赖由valgrind
分配的任何内存来获得零。当然,您不应该期望程序中其他地方存在的指向该内存的指针为零。
值得在taBytes[nOutIdx] = (nUint24 >>> ((16 >>> nMod3) & 24)) & 255;
或类似的环境下运行程序,以检测程序偶然发生的情况。
答案 2 :(得分:1)
void free(void *ptr);
函数原型表明无法为指针设置任何值
ptr
。
因此,存储的引用将与调用之前相同,但是它将引用无效的内存位置。这种指针称为"dangling pointers"
。如果使用此指针,则它是未定义行为。
调用UB的程序可能会采取任何措施,包括正确的可观察的行为,但这是不正确的。
您需要确保不使用悬空指针。
答案 3 :(得分:0)
free
不能在调用方中将其指针参数归零,因为指针参数
按值(副本)获取。
void free(void *ptr);
在保留与free
一样的泛型的同时,您将无法做到这一点,因为free
不仅将释放指向void的指针,还将释放指向非限定类型的任何其他指针(=将隐式转换为void *
的任何其他指针)。
如果出于安全或其他原因想要进行这种归零,同时保留free
的通用性,则可以将其自由包装在宏中。
示例:
#include <stdlib.h>
#include <assert.h>
#define FREE(Pp) (free(*(Pp)),*(Pp)=NULL)
int main(void)
{
char *m = malloc(1);
if (!m) return 1;
FREE(&m);
assert(!m);
}