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

Cor*_*ory 16 c pointers

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

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

//Situation B
ptr1 = realloc(ptr2, 3 * sizeof(int));
free(ptr1);
ptr1 = ptr2;
Run Code Online (Sandbox Code Playgroud)

小智 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);
Run Code Online (Sandbox Code Playgroud)


Eri*_*rik 10

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

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

ptr1 = malloc(...);
memcpy(ptr1, ptr2, ...);
free(ptr2);
Run Code Online (Sandbox Code Playgroud)

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

与其他分配函数一样,realloc如果失败则返回NULL - 您可能想要检查它.

  • "ptr2无效且不应该使用" - 除非返回空指针,在这种情况下,ptr2仍然有效并且最终仍需要释放.所以在等效代码中,第二行和第三行都只是`if(ptr1)`. (3认同)

gee*_*aur 5

realloc()自动释放原始内存,或者如果您realloc()使用较小的大小或有未分配的内存可用于简单地扩展原始分配,则将其原样返回(除了元数据)。