使用realloc时,内存是否会自动释放?还是需要在realloc中使用free?以下哪种说法是正确的?
//Situation A
ptr1 = realloc(ptr1, 3 * sizeof(int));
//Situation B
ptr1 = realloc(ptr2, 3 * sizeof(int));
free(ptr1);
ptr1 = ptr2;
两者都不正确。realloc() 可以返回指向新分配内存的指针,也可以在错误时返回NULL。你应该检查返回值:
ptr1 = realloc(ptr2, 3 * sizeof(int));
if (!ptr1) {
/* Do something here to handle the failure */
/* ptr2 is still pointing to allocated memory, so you may need to free(ptr2) here */
}
/* Success! ptr1 is now pointing to allocated memory and ptr2 was deallocated already */
free(ptr1);
在 ptr1 = realloc(ptr2, 3 * sizeof(int));
之后,ptr2 变得无效,不应该再使用它。只需要释放 ptr1
。在 某些情况下,realloc
的返回值将会和你传入的值相同。
你可以安全地将 ptr1=realloc(ptr2, ...
等价于以下代码:
ptr1 = malloc(...);
memcpy(ptr1, ptr2, ...);
free(ptr2);
通常情况下,除非新的内存大小仍适合于旧的内存块,否则会发生以下情况 - 然后realloc可能会返回原始内存块。
像其他分配函数一样,realloc
如果失败,则会返回NULL - 您可能需要检查该值。
realloc()
函数会自动释放原始内存,如果你将其用于更小的空间或有未分配的内存可用于在原地扩展原始分配,则会返回未更改的原始内存(除了元数据)。
realloc
如果重新分配成功,则返回新的内存块,否则保留原始内存块。标准用法如下:
ptr2 = realloc(ptr1, new_size);
if (ptr2 == NULL) {
//ptr1 still contains pointer to original array
} else {
//ptr2 contains new array, ptr1 is invalid
}
realloc
在失败时返回NULL。 - pmg
if (ptr1)
。 - Steve Jessop