我正在使用 void *realloc(void *pointer, size_t size);
来增加指针的大小。 realloc 是如何工作的?
它是否创建一个 nre 地址空间,并将旧值复制到新地址空间并返回该地址的指针?或者它只是分配更多内存并将其绑定(bind)到旧内存?
最佳答案
@Iraklis有正确的答案:它会执行第二个(如果它可以逃脱)或第一个(但只有在必须这样做的情况下)。
然而,有时两者都做不到,而且会失败。注意:如果它无法调整数据大小,它将返回 NULL
,但内存将NOT空闲
d。这样的代码是错误的:
ptr = realloc(ptr, size);
如果 realloc
返回 NULL
,旧的 ptr
将永远不会得到 free
d 因为你已经覆盖了它使用 NULL
。要正确执行此操作,您必须执行以下操作:
void *tmp = realloc(ptr, size);
if(tmp) ptr = tmp;
else /* handle error, often with: */ free(ptr);
在BSD系统上,上面的内容变成了一个名为reallocf
的库函数,实现如下:
void *reallocf(void *p, size_t s)
{
void *tmp = realloc(p, s);
if(tmp) return tmp;
free(p);
return NULL;
}
让您安全使用:
ptr = reallocf(ptr, size);
请注意,如果 realloc
必须分配新空间并复制旧数据,它将 释放
旧数据。只有当它无法调整大小时,它才会完整地保留您的数据,以防调整大小失败是可恢复的错误。
关于c++ - 在 c 中使用 realloc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5322364/