【问题标题】:C Memory leaks with char **C 内存泄漏与 char **
【发布时间】:2015-11-26 23:42:08
【问题描述】:

我正在使用 C malloc 和免费工具,我遇到了奇怪的内存泄漏。有人知道吗?

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

所以在函数 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 问题有任何线索,请告诉我。

【问题讨论】:

  • 请不要将答案编辑到问题中,这会让未来的读者感到奇怪。 (虽然编辑实际上是不正确的,*array[++i] 应该是(*array)[++i],下一行也是如此)

标签: c memory memory-management memory-leaks


【解决方案1】:

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

【讨论】:

  • 谢谢,我不知道我怎么会错过那些 XD while 而不是 for 来自我的学校规则,它禁止使用 for 循环,没有真正的充分理由.
猜你喜欢
  • 2018-10-09
  • 2014-11-13
  • 2015-06-28
  • 2017-02-19
  • 1970-01-01
  • 1970-01-01
  • 2015-07-22
  • 2011-05-05
  • 1970-01-01
相关资源
最近更新 更多