8

给定以下代码:

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。

4

4 回答 4

8

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

来自 C99 标准(§7.20.3/1):

如果请求的空间大小为零,则行为是实现定义的:要么返回空指针,要么行为就好像大小是某个非零值,但返回的指针不应用于访问对象.

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

于 2010-03-30T15:55:16.960 回答
5

不必要。

它通常与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);
}

有了理智的实现,mallocfree一个剪辑就不会无限制地消耗内存。但是,如果realloc实现返回那些“最小尺寸的对象”,它可能会。

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

简而言之,如果你的意思是 free你应该说free

于 2010-03-30T15:48:54.513 回答
2

http://www.cplusplus.com/reference/clibrary/cstdlib/realloc/说是的。

于 2010-03-30T15:46:18.707 回答
1

是的

C99 标准 §7.20.3.4 (realloc) 说:

realloc 函数释放 ptr 指向的旧对象,并返回一个指向具有 size 指定大小的新对象的指针。新对象的内容应与释放前旧对象的内容相同,直至新旧大小中的较小者。新对象中超出旧对象大小的任何字节都具有不确定的值。

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

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

如果请求的空间大小为零,则行为由实现定义:要么返回空指针,要么行为好像大小是某个非零值,但返回的指针不应用于访问对象。

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

于 2010-03-30T16:12:40.370 回答