C内存泄漏与char **

时间:2015-11-26 23:42:09

标签: c memory memory-management memory-leaks

我正在玩C malloc和免费工具,我有一个奇怪的内存泄漏。有人对此有所了解吗?

目标是成功释放char **。

所以在函数freezer中,我释放char **中的每个char *,然后我释放char **。

但Valgrind(我在linux上的泄漏检测器)发现4个块中的20个字节泄露(我不知道我是否可以写'泄漏'XD) 更有趣的是,如果我通过添加一个char *来做更大的char **,它会在另一个块中泄漏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问题有任何疑问,请告诉我。

1 个答案:

答案 0 :(得分:0)

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