【发布时间】:2011-03-24 23:11:39
【问题描述】:
使用 realloc 时内存会自动释放吗?或者是否有必要将 free 与 realloc 一起使用?以下哪项是正确的?
//Situation A
ptr1 = realloc(ptr1, 3 * sizeof(int));
//Situation B
ptr1 = realloc(ptr2, 3 * sizeof(int));
free(ptr1);
ptr1 = ptr2;
【问题讨论】:
使用 realloc 时内存会自动释放吗?或者是否有必要将 free 与 realloc 一起使用?以下哪项是正确的?
//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 - 您可能需要检查一下。
【讨论】:
if (ptr1)。
realloc() 自动释放原始内存,或者如果您将realloc() 缩小到较小的大小或有未分配的内存可用于简单地扩展原始分配,则将其原封不动地返回(元数据除外)。
【讨论】:
根据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。
在这两种情况下,ptr1 都必须被释放。
情况 B 更复杂,因为 ptr2 可能指向已释放的空间。或不。这取决于它是否可以重新分配。在 B 中 realloc 之后不应该使用 ptr2。
【讨论】: