如果将数据移动到不同的块,C++ realloc 函数是否会对旧数据块进行删除操作?

问题描述 投票:0回答:4

该函数可能会将内存块移动到新位置,在这种情况下,将返回新位置。
例如我有一个指向数组的指针:

int *arr; // somewhere next it initialized, filled with elements and etc

我需要的地方:

void* location = realloc(arr, NEW_SIZE);

旧的内存块位置会发生什么?

如果 realloc 返回与 arr 不相关的指针,我应该使用下一个代码吗?:

delete arr;
arr = (int*)location;
c++ memory-management dynamic-memory-allocation realloc
4个回答
7
投票

函数

realloc
继承自古老的 C。它不运行析构函数或执行任何其他 C++ 魔法。它也只能应用于使用
malloc
(和朋友)分配的块——它不能用于使用“new”分配的块。


4
投票

规则 #1:不要将 new/delete 与 malloc/free 混合在一起。

如果您首先使用

malloc()
进行分配并且需要更大的堆空间,那么您需要调用
realloc()
,这将返回一个新指针,该指针可能不会映射到与
arr
相同的内存区域,因此你不应该使用它。

使用

free

释放已分配/重新分配的空间

3
投票

realloc(void *ptr, size_t new_size) 要求

ptr
指向的给定内存区域 之前由 malloc()、calloc() 或 realloc() 分配,并且尚未使用 free() 释放,否则,结果未定义。

仅将 reallocmalloccalloc 或其他 realloc 一起使用,并使用 free 清理它。
在 C++ 中,始终使用 newdelete 以及 new[]delete[]


0
投票

旧的内存块位置会发生什么?

这个问题还没有答案。答案很简单,很容易签入您的代码。就我而言,当

realloc
返回相同的地址时(通常如果我减小块大小),使用旧地址调用
free
不会产生错误,因为它也是一个 new 地址。当它返回不同的地址时,使用旧地址调用
free
会失败。

所以我认为它在重新分配时确实会释放旧块:

void* location = realloc(arr, NEW_SIZE);
// do not delete arr, it points to the same or freed block
© www.soinside.com 2019 - 2024. All rights reserved.