如果我重新分配并且新大小为0会发生什么?这相当于免费吗?
给出以下代码:
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。
不必要。
它通常与munissor发布的链接一样 ,但Mac OS 10.5手册页说:
如果size为零且ptr不为NULL,则会分配一个新的最小大小的对象,并释放原始对象。
什么是“最小尺寸物体”? 好吧,任何分配器都存储有关分配的一些信息,并且除了为用户保留的空间之外,还需要占用空间。 据推测,“最小尺寸对象”只是这些标题中的一个加上为用户保留的零字节空间。
我猜这个规定是为了支持标准化时存在的实现,并且这些实现对调试分配行为很有用。
解决乔纳森的评论
考虑之间的区别
for (int i=0; i
和
for (int i=0; i
有了一个理智的malloc
和free
实现,第一个剪辑不会消耗内存而不受限制。 但是如果realloc
实现返回那些“最小大小的对象”,它可能会。
当然这个例子是人为的,它依赖于理解“最小尺寸对象”的含义,但我认为文本允许它。
简而言之,如果你的意思是 free
你应该说是free
。
它可能或可能不等同于在指针上调用free
; 结果是实现定义的。
根据C99标准(§7.20.3/ 1):
如果请求的空间大小为零,则行为是实现定义的:返回空指针,或者行为就像大小是非零值一样,但返回的指针不应用于访问对象。
这适用于所有内存管理function,包括realloc
。
是
C99标准§7.20.3.4(realloc)说:
realloc函数解除分配ptr指向的旧对象,并返回指向具有size指定大小的新对象的指针。 新对象的内容应与解除分配之前的旧对象的内容相同,直到新旧大小中的较小者为止。 新对象中超出旧对象大小的任何字节都具有不确定的值。
如果ptr是空指针,则realloc函数的行为类似于指定大小的malloc函数。 否则,如果ptr与之前由calloc,malloc或realloc函数返回的指针不匹配,或者如果通过调用free或realloc函数释放了空间,则行为未定义。 如果无法分配新对象的内存,则不会释放旧对象,并且其值不会更改。
这清楚地表明旧对象被释放(释放)。 返回值可能是空指针,也可能是§7.20.3的一般注释中指定的值:
如果请求的空间大小为零,则行为是实现定义的:返回空指针,或者行为就像大小是非零值一样,除了返回的指针不应用于访问对象。
无论哪种方式,您都不能取消引用返回的值:它可以用作free()
的参数,或者只要它们不引用它就传递给其他函数。