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

And*_*anu 8 c realloc

给出以下代码:

int *a = NULL;
a = calloc(1, sizeof(*a));
printf("%d\n", a);
a = realloc(a, 0);

printf("%d\n", a);
return (0);
Run Code Online (Sandbox Code Playgroud)

它返回:

4078904
0
Run Code Online (Sandbox Code Playgroud)

这个realloc是免费的吗?

注意:我在WindowsXP下使用MinGW.

Jam*_*lis 8

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

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

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

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

  • @Jonathan:如果行为是"好像大小是一些非零值",那么未能释放结果指针将导致内存泄漏.在这种情况下,它并不完全等同于在指针上调用free. (3认同)

dmc*_*kee 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);
}
Run Code Online (Sandbox Code Playgroud)

for (int i=0; i<VERY_BIG_NUMBER; ++i){
  char *p = malloc(sizeof(char[10]));
  realloc(p,0);
}
Run Code Online (Sandbox Code Playgroud)

有了健全的实施mallocfree第一夹并不会无限制地消耗内存。但是如果realloc实现返回那些“最小大小的对象”,它可能会。

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

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