给出以下代码:
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是免费的吗?
注意:我在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.