给出以下代码:
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。
答案 0 :(得分:8)
它可能或可能不等同于在指针上调用free
;结果是实现定义的。
根据C99标准(§7.20.3/ 1):
如果请求的空间大小为零,则行为是实现定义的:返回空指针,或者行为就像大小是非零值一样,但返回的指针不应用于访问一个对象。
这适用于所有内存管理功能,包括realloc
。
答案 1 :(得分:4)
不一定。
它通常与link that munissor posted一样,但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
。
答案 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()
的参数,或者只要它们不引用它就传递给其他函数。