c - 在对指针到指针数组调用 realloc 以缩小其大小之前是否有必要释放子指针?

标签 c arrays pointers malloc

例如,我有这个 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]);
}

最佳答案

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

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

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

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

关于c - 在对指针到指针数组调用 realloc 以缩小其大小之前是否有必要释放子指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31089640/

相关文章:

c - 使用 ProtoBuf 将数据流式传输到带有 header 的日志文件

c++ - 无法找到请求的 Boost 库 Windows Cmake

php - 转换 { key : Value } Object Into Standard Variables with jQuery

c++ - 关于类内部指针的问题

C++ Getter 方法打印奇怪的数字

c++ - 什么是符合 C 和 C++ 的可变参数函数?

c - (char *) x 或 (void *) z 是什么意思?

c - 在 C 中将所有元素设置为相同的值

c - 从内存中的特定地址开始初始化数组 - C编程

c++ - 当我以这种方式修改交换函数时会发生什么?