C 字符 ** 导致内存泄漏

标签 c memory memory-management memory-leaks

我正在使用 C malloc 和 free 工具,并且遇到了奇怪的内存泄漏。有人对此有想法吗?

目标是成功释放一个字符**。

因此,在函数卡住器中,我释放了 char** 中的每个 char* 并释放了 char**。

但是 Valgrind(我在 Linux 上的泄漏检测器)发现 4 个 block 中有 20 个字节泄漏(我不知道我是否可以写“泄漏”XD) 更有趣的部分是,如果我通过在其中添加 char* 来实现更大的 char**,它会在另一个 block 中泄漏 5 个字节的内存:/。

#include <stdio.h>
#include <stdlib.h>
void    freezer(char ***array, int length){
    int i;

    i = -1;
    while (*array[++i] != NULL){
        free(*array[i]);
    }
    free(*array);
}

int     main(){

    char    **big;
    int len = 4;
    int i;

    big = malloc(sizeof(char *) * (len + 1));
    i = -1;
    while (++i < len){
        big[i] = malloc(sizeof(char) * 5);
        big[i][0] = 't';
        big[i][1] = 'e';
        big[i][2] = 's';
        big[i][3] = 't';
        big[i][4] = '\0';
    }
    big[i] = NULL;
    i = -1;
    while (++i < len){
        printf("i: %d\t%s\n", i, big[i]);
    }
    freezer(&big, len);
    return (0);
}

您可以直接复制/粘贴/运行代码。

因此,如果您对错误/C 问题有任何线索,请告诉我。

最佳答案

big[i] = NULL; 导致缓冲区溢出。您只为总共 len 条目分配了空间,再加上一个字节;但此时i == len

也许你的意思是big = malloc(sizeof(char *) * (len + 1));

此外,freezer 函数取消引用并释放了错误的东西。要么将其更改为接受 char **array ,要么将函数内所有出现的 array 替换为 (*array) 。前者更好,不需要通过引用传递来调用 free

<小时/>

你的循环结构很奇怪,没有明显的原因;正常使用:

for (i = 0; i < len; ++i)

这是相同的逻辑,但会让阅读代码的人更容易理解。

此外,don't cast malloc

关于C 字符 ** 导致内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33948496/

相关文章:

c - sqrt() 函数在 c 中不起作用我的数学错误是什么?

.net - .NET中的对象内存分析

c - 为什么 C 程序使用 libmath 的 .so 比使用 libmath 的 .a 显示更多的内存?

java - OpenJDK JVM 会把堆内存还给 Linux 吗?

iphone - EXC_BAD_ACCESS 与 NSFetchedResultsController

android - 从 Activity 中调用 finish() 会释放我的内存空间吗?

我可以重新定义一个函数或检查它是否存在吗?

c - 如何在C中正确打印变量?

linux - 虚拟连续与物理连续内存

c - newlib-nano printf 在嵌入式项目中转换为 iprintf