释放的内存是否将引用它的指针设置为null?

时间:2020-09-04 14:29:00

标签: c pointers null

想象一下我有一个链表的结构:

struct node{
     int data;
     struct node* next;
     struct node* prev;
};

我释放了最后一个节点;节点的next指针是否会自动变为NULL

因为我注意到我没有在程序中执行此操作,但是一切正常。

4 个答案:

答案 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);
}
相关问题