释放的内存是否将引用它的指针设置为空?
Does a freed memory set pointers referencing to it to null?
假设我有一个链表结构:
struct node{
int data;
struct node* next;
struct node* prev;
};
我释放了最后一个节点;节点的next
指针在它变成NULL
之前自动?
因为我注意到我没有在程序中这样做,但一切运行良好..
您当然不应该 依赖 任何由 malloc()
分配的内存,以便在您调用 free()
时清零。当然,您不应该期望程序中其他地方存在的任何指向该内存的指针都归零。
值得 运行 低于 valgrind
或类似的程序,以检测程序因幸运巧合而运行的情况。
没有
至于为什么你的程序看起来 运行 即使你忘记重置指针也可以,这可能是你运气好。
void free(void *ptr);
函数原型显示无法为指针设置任何值
ptr
.
因此存储的引用将与调用前相同,但它将引用无效的内存位置。这种指针称为"dangling pointers"
。如果您使用此指针,则它是 未定义行为。
调用 UB 的程序可能会以任何方式运行,包括正确的可观察行为,但这是不正确的。
您需要确保没有使用悬挂指针。
free
无法在调用者中将其指针参数归零,因为指针参数
按值取值(复制)。
void free(void *ptr);
你不能有一个函数在保持像 free
一样通用的情况下执行它,因为 free
不仅会释放指向 void 的指针,还会释放任何其他指向 non-qualified 类型(=任何其他将隐式转换为 void *
的指针)。
如果出于安全或其他原因需要这样的归零,同时保留 free
的通用性,您可以将 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);
}
假设我有一个链表结构:
struct node{
int data;
struct node* next;
struct node* prev;
};
我释放了最后一个节点;节点的next
指针在它变成NULL
之前自动?
因为我注意到我没有在程序中这样做,但一切运行良好..
您当然不应该 依赖 任何由 malloc()
分配的内存,以便在您调用 free()
时清零。当然,您不应该期望程序中其他地方存在的任何指向该内存的指针都归零。
值得 运行 低于 valgrind
或类似的程序,以检测程序因幸运巧合而运行的情况。
没有
至于为什么你的程序看起来 运行 即使你忘记重置指针也可以,这可能是你运气好。
void free(void *ptr);
函数原型显示无法为指针设置任何值
ptr
.
因此存储的引用将与调用前相同,但它将引用无效的内存位置。这种指针称为"dangling pointers"
。如果您使用此指针,则它是 未定义行为。
调用 UB 的程序可能会以任何方式运行,包括正确的可观察行为,但这是不正确的。
您需要确保没有使用悬挂指针。
free
无法在调用者中将其指针参数归零,因为指针参数
按值取值(复制)。
void free(void *ptr);
你不能有一个函数在保持像 free
一样通用的情况下执行它,因为 free
不仅会释放指向 void 的指针,还会释放任何其他指向 non-qualified 类型(=任何其他将隐式转换为 void *
的指针)。
如果出于安全或其他原因需要这样的归零,同时保留 free
的通用性,您可以将 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);
}