给定以下代码:
int *a = NULL;
a = calloc(1, sizeof(*a));
printf("%d\n", a);
a = realloc(a, 0);
printf("%d\n", a);
return (0);
它返回:
4078904
0
这个 realloc 是否等同于 free ?
注意:我在 WindowsXP 下使用 MinGW。
它可能等同于也可能不等同于调用free
指针;结果是实现定义的。
来自 C99 标准(§7.20.3/1):
如果请求的空间大小为零,则行为是实现定义的:要么返回空指针,要么行为就好像大小是某个非零值,但返回的指针不应用于访问对象.
这适用于所有内存管理功能,包括realloc
.
不必要。
它通常与munissor 发布的链接一样,但 Mac OS 10.5 手册页说:
如果 size 为零且 ptr 不为 NULL,则分配一个新的、最小大小的对象并释放原始对象。
什么是“最小尺寸对象”?好吧,任何分配器都会存储一些关于分配的信息,这会占用通常分配给用户的空间之外的空间。据推测,“最小大小的对象”只是这些标头之一加上为用户保留的零字节空间。
我猜想这个条款的存在是为了支持标准化时存在的实现,并且这些实现对于调试分配行为很有用。
解决乔纳森的评论
考虑之间的区别
for (int i=0; i<VERY_BIG_NUMBER; ++i){
char *p = malloc(sizeof(char[10]));
free(p);
}
和
for (int i=0; i<VERY_BIG_NUMBER; ++i){
char *p = malloc(sizeof(char[10]));
realloc(p,0);
}
有了理智的实现,malloc
第free
一个剪辑就不会无限制地消耗内存。但是,如果realloc
实现返回那些“最小尺寸的对象”,它可能会。
当然,这个例子是人为的,它依赖于理解“最小尺寸对象”的含义,但我认为文本允许这样做。
简而言之,如果你的意思是 free
你应该说free
。
C99 标准 §7.20.3.4 (realloc) 说:
realloc 函数释放 ptr 指向的旧对象,并返回一个指向具有 size 指定大小的新对象的指针。新对象的内容应与释放前旧对象的内容相同,直至新旧大小中的较小者。新对象中超出旧对象大小的任何字节都具有不确定的值。
如果 ptr 是空指针,则 realloc 函数的行为类似于指定大小的 malloc 函数。否则,如果 ptr 与 calloc、malloc 或 realloc 函数先前返回的指针不匹配,或者如果空间已通过调用 free 或 realloc 函数被释放,则行为未定义。如果无法为新对象分配内存,则不会释放旧对象并且其值不变。
这清楚地表明旧对象已被释放(释放)。返回值可能是空指针,也可能是第 7.20.3 节的一般说明中指定的值:
如果请求的空间大小为零,则行为由实现定义:要么返回空指针,要么行为好像大小是某个非零值,但返回的指针不应用于访问对象。
无论哪种方式,您都不能取消引用返回的值:它可以用作 的参数free()
,或者传递给其他函数,只要它们反过来不引用它。