如果我重新分配并且新大小为0会发生什么?这相当于免费吗?

时间:2010-03-30 15:44:57

标签: c realloc

给出以下代码:

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。

4 个答案:

答案 0 :(得分:8)

它可能或可能不等同于在指针上调用free;结果是实现定义的。

根据C99标准(§7.20.3/ 1):

  

如果请求的空间大小为零,则行为是实现定义的:返回空指针,或者行为就像大小是非零值一样,但返回的指针不应用于访问一个对象。

这适用于所有内存管理功能,包括realloc

答案 1 :(得分:4)

不一定。

它通常与link that munissor posted一样,但Mac OS 10.5手册页说:

  

如果size为零且ptr不为NULL,则分配一个新的最小大小的对象,并释放原始对象。

什么是“最小尺寸物体”?好吧,任何分配器都存储有关分配的一些信息,并且除了为用户保留的空间之外,还需要占用空间。据推测,“最小尺寸对象”只是这些标题中的一个加上为用户保留的零字节空间。

我猜这个规定是为了支持标准化时存在的实现,并且这些实现对调试分配行为很有用。


解决Jonathan's comments

考虑

之间的区别
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);
}

通过mallocfree的合理实现,第一个剪辑消耗内存而不受限制。但是如果realloc实现返回那些“最小大小的对象”,它可能会。

当然这个例子是人为的,它依赖于理解“最小尺寸对象”的含义,但我认为文本允许它。

简而言之,如果你意味着 free,你应该说free

答案 2 :(得分:2)

答案 3 :(得分:1)

C99标准§7.20.3.4(realloc)说:

  

realloc函数释放ptr指向的旧对象并返回一个   指向具有size指定大小的新对象的指针。新内容   在解除分配之前,对象应与旧对象的对象相同,直到较小的对象   新旧尺寸。新对象中超出旧对象大小的任何字节都有   不确定的价值观。

     

如果ptr是空指针,则realloc函数的行为类似于malloc函数   指定大小。否则,如果ptr与之前返回的指针不匹配   calloc,malloc或realloc函数,或者如果空间已被调用释放   对于free或realloc函数,行为是未定义的。如果记忆为新的   无法分配对象,旧对象未被释放,其值不变。

这清楚地表明旧对象已被释放(释放)。返回值可能是空指针,也可能是§7.20.3的一般注释中指定的值:

  

如果请求的空间大小为零,则行为是实现定义的:   返回空指针,或者行为就像大小一样   非零值,但返回的指针不得用于访问对象。

无论哪种方式,你都不能取消引用返回的值:它可以用作free()的参数,或者只要它们不引用它就传递给其他函数。