C语言中,如果使用realloc函数,是否需要使用free函数?

17

使用realloc时,内存是否会自动释放?还是需要在realloc中使用free?以下哪种说法是正确的?

//Situation A
ptr1 = realloc(ptr1, 3 * sizeof(int));

//Situation B
ptr1 = realloc(ptr2, 3 * sizeof(int));
free(ptr1);
ptr1 = ptr2;
5个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
42

两者都不正确。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);

13

ptr1 = realloc(ptr2, 3 * sizeof(int));之后,ptr2 变得无效,不应该再使用它。只需要释放 ptr1。在 某些情况下realloc 的返回值将会和你传入的值相同。

你可以安全地将 ptr1=realloc(ptr2, ... 等价于以下代码:

ptr1 = malloc(...);
memcpy(ptr1, ptr2, ...);
free(ptr2);

通常情况下,除非新的内存大小仍适合于旧的内存块,否则会发生以下情况 - 然后realloc可能会返回原始内存块。

像其他分配函数一样,realloc如果失败,则会返回NULL - 您可能需要检查该值。


3
"ptr2是无效的,不应使用" - 除非返回空指针,在这种情况下,ptr2仍然有效,最终仍需要释放。因此,在等效的代码中,第二行和第三行都只是 if (ptr1) - Steve Jessop

5

realloc() 函数会自动释放原始内存,如果你将其用于更小的空间或有未分配的内存可用于在原地扩展原始分配,则会返回未更改的原始内存(除了元数据)。


1
根据http://www.cplusplus.com/reference/clibrary/cstdlib/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
我试图通过编辑来修复它,不想删除已经写好的内容。你知道如何在这里添加删除线以表示不需要的文本吗? - Adam Trhon
1
只需删除错误即可。编辑的目的是改进答案。如果有人认为在他们看来pmg的评论与答案不符,他们可以查看修订历史记录。 - Steve Jessop

0
在这两种情况下,ptr1都必须被释放。 情况B更加复杂,因为ptr2可能指向已经释放的空间。或者不是。这取决于它是否可以被重新分配。在B中realloc之后不应再使用ptr2。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,