该函数可能会将内存块移动到新位置,在这种情况下,将返回新位置。
例如我有一个指向数组的指针:
int *arr; // somewhere next it initialized, filled with elements and etc
我需要的地方:
void* location = realloc(arr, NEW_SIZE);
旧的内存块位置会发生什么?
如果 realloc 返回与 arr 不相关的指针,我应该使用下一个代码吗?:
delete arr;
arr = (int*)location;
函数
realloc
继承自古老的 C。它不运行析构函数或执行任何其他 C++ 魔法。它也只能应用于使用 malloc
(和朋友)分配的块——它不能用于使用“new”分配的块。
规则 #1:不要将 new/delete 与 malloc/free 混合在一起。
如果您首先使用
malloc()
进行分配并且需要更大的堆空间,那么您需要调用realloc()
,这将返回一个新指针,该指针可能不会映射到与arr
相同的内存区域,因此你不应该使用它。
使用
free
释放已分配/重新分配的空间
realloc(void *ptr, size_t new_size) 要求
ptr
指向的给定内存区域 之前由 malloc()、calloc() 或 realloc() 分配,并且尚未使用 free() 释放,否则,结果未定义。
仅将 realloc 与 malloc、calloc 或其他 realloc 一起使用,并使用 free 清理它。
在 C++ 中,始终使用 new 与 delete 以及 new[] 与 delete[]。
旧的内存块位置会发生什么?
这个问题还没有答案。答案很简单,很容易签入您的代码。就我而言,当
realloc
返回相同的地址时(通常如果我减小块大小),使用旧地址调用 free
不会产生错误,因为它也是一个 new 地址。当它返回不同的地址时,使用旧地址调用free
会失败。
所以我认为它在重新分配时确实会释放旧块:
void* location = realloc(arr, NEW_SIZE);
// do not delete arr, it points to the same or freed block