【问题标题】:Is it necessary to free sub-pointer before calling realloc on pointer-to-pointer array to shrink its size?在指针到指针数组上调用 realloc 以缩小其大小之前是否有必要释放子指针?
【发布时间】:2023-03-24 19:25:02
【问题描述】:

例如,我有这个 C 代码:

int len = 100;
int i;

// arr is pointer-to-pointer 2d array of char
char **arr = malloc(len * sizeof(char*));

for (i = 0; i < len; i++)
{
    // Allocate the sub-pointer
    arr[i] = malloc(len * sizeof(char));
    ...
}

...

// Is this part necessary?
for (i = 0; i < len; i++)
{
    // Freeing the sub-pointer
    free(arr[i]);
}

// Shrink the arr's size from 100 to 50
char** temp = realloc(arr, 50 * sizeof(char*));
...

在为arr 做realloc 以缩小其大小(从100 到50)之前,是否需要释放arr 的子指针?

for (i = 0; i < len; i++)
{
    free(arr[i]);
}

【问题讨论】:

  • 您为什么认为它可能是必要的? (画一张图以一种或另一种方式说服自己。)
  • 只需阅读realloc 参考:/
  • 我正在调用 realloc 将大小从 100 缩小到 50,正如您看到的 arr 是指针到指针。通过将arr 缩小到更小的尺寸(50),是否不需要释放来自arr 的其他50 个子指针? realloc 会处理免费的吗?

标签: c arrays pointers malloc


【解决方案1】:

是的,如果重新分配的数组的大小小于原始大小,则必须释放所有指针。例如

for (i = 50; i < len; i++)
{
    free(arr[i]);
}

char** temp = realloc(arr, 50 * sizeof(char*));

C 没有析构函数,因此您必须手动释放已删除元素指向的所有对象。否则会出现内存泄漏。

【讨论】:

  • @Vlad 你不能依赖它。但是通过编辑我可以说它变成了一个可能重复:stackoverflow.com/questions/9575122/…
  • @iharob realloc 对存储在分配数组中的指针不做任何事情。会有内存泄漏。
  • 那不是真的(:面对 C99 标准。
  • @VladfromMoscow 是的,我想你是对的,我想的是指针地址,而不是他们的指针。
  • (C99, 7.20.3.4p2) “realloc 函数释放 ptr 指向的旧对象,并返回一个指向具有 size 指定大小的新对象的指针。” >> C99 7.20.3.4 §4:realloc 函数返回一个指向新对象的指针(可能与指向旧对象的指针具有相同的值)
猜你喜欢
  • 2012-07-17
  • 2012-03-17
  • 1970-01-01
  • 2011-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多