【问题标题】:Memory Leak - Valgrind - "0 bytes lost in 59 blocks"内存泄漏 - Valgrind - “在 59 个块中丢失了 0 个字节”
【发布时间】:2019-11-09 15:49:41
【问题描述】:

Valgrind 说由于我的函数 ft_strdup,我在 59 个块中有 59 个字节的内存泄漏:

char            *ft_strdup(const char *s)
{
    char    *dup;
    int     i;

    i = 0;
    dup = (char *)malloc((ft_strlen(s) + 1) * sizeof(char));
    if (!dup)
        return (NULL);
    while (s[i])
    {
        dup[i] = s[i];
        i++;
    }
    dup[i] = '\0';
    return (dup);
}

但是当我将分配的大小更改为:

dup = (char *)malloc(ft_strlen(s) * sizeof(char));

Valgrind 向我展示了这个结果:

==36929==    definitely lost: 0 bytes in 59 blocks
==36929==    indirectly lost: 0 bytes in 0 blocks

既然没有任何字节丢失,为什么仍然显示 59 个块而不是 0 个块?

【问题讨论】:

  • 当然调用者应该释放你的函数返回的内存。你的函数在我看来是正确的。
  • 您的第二次分配是错误的,因为您确实需要那个终止空字符。
  • 我在这里看到两件事:(1)正如@PaulOgilvie所说,你的函数返回的指针应该由调用者释放,你需要为字符串+空终止符分配空间特点。 (2) 告诉我你的函数 ft_strlen 返回 0;这解释了第一次分配的 59 个字节与分配的数量相匹配(未释放);当您更改为错误的第二个分配时,您分配了 0 个字节。

标签: c memory-management memory-leaks valgrind


【解决方案1】:

当你将分配的大小更改为:

dup = (char *)malloc(ft_strlen(s) * sizeof(char));

您正在用终止 \0 字符覆盖尚未分配的内存,这几乎是您问题的根源。

同意,valgrind 可以提供更好的诊断,但它也可以提供更差的诊断。

【讨论】:

  • 他的第一种分配方式呢?
  • @PaulOgilvie 的第一个表格没有来自 valgrind 的投诉
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-24
  • 1970-01-01
  • 2020-03-31
  • 2016-03-15
  • 2014-04-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多