C - 如果使用realloc是免费必要的吗?

时间:2011-03-24 23:11:39

标签: c pointers

使用realloc时是否自动释放内存?或者是否有必要免费使用realloc?以下哪项是正确的?

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

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

5 个答案:

答案 0 :(得分:41)

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

答案 1 :(得分:10)

ptr1 = realloc(ptr2, 3 * sizeof(int)); ptr2无效后不应使用。您只需要免费ptr1。在某些情况下,realloc的返回值将与您传入的值相同。

您可以安全地将ptr1=realloc(ptr2, ...视为与此等效:

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

在大多数情况下会发生这种情况,除非新的大小仍然适合旧的内存块 - 然后realloc可以返回原始内存块。

作为其他分配函数,realloc如果失败则返回NULL - 您可能想要检查它。

答案 2 :(得分:4)

realloc()会自动释放原始内存,或者如果realloc()更小,或者有未分配的内存可用于简单地扩展原始分配,则会自动恢复原始内存(元数据除外)。< / p>

答案 3 :(得分: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
}

答案 4 :(得分:0)

在这两种情况下,都必须释放ptr1。

情况B更复杂,因为ptr2可能指向释放的空间。或不。这取决于它是否可以重新分配。在B中重新分配后不应使用ptr2。