【问题标题】:C Array leaking memoryC 数组泄漏内存
【发布时间】:2013-01-19 20:50:48
【问题描述】:

我有一个简单的程序,它只是用数字填充一个数组并打印每个数字。

然而,valgrind 声称至少有 8000 字节的内存泄漏。

int main(int argc, char *argv[])
{
    int numbers[10];
    int i = 0;
    for(i = 0; i < 10; i++)
    {
        numbers[i] = i;
        printf("%d",numbers[i]);
    }
    free(numbers);
    return EXIT_SUCCESS;
}

谁能解释一下内存泄漏在哪里?

这是释放为数组分配的空间的正确方法吗?

【问题讨论】:

    标签: c memory valgrind memory-leaks


    【解决方案1】:

    没有内存泄漏,没有定义的行为。您正在释放尚未分配的内存,导致出现问题。

    您只需要在使用malloccallocrealloc 分配的内存上调用free。在任何其他内存位置调用 free 是未定义的行为。在您的情况下,numbers 分配在自动内存(也称为“堆栈”)中。一旦超出范围,该内存就会自动释放。

    有两种方法可以修复您的程序:

    • int numbers[10]; 替换为int *numbers = malloc(10*sizeof(int));,或
    • 删除free(numbers);

    【讨论】:

    • 即使我拿走 'free(numbers)',valgrind 仍然说有内存泄漏。
    • @nope 它到底说了什么? Valgrind 吐出了几个数字,并不是所有的数字都声称被泄露。
    • ==8223== 泄漏摘要:==8223== 肯定丢失:14 个块中的 8,624 个字节 ==8223== 间接丢失:5 个块中的 1,168 个字节 ==8223== 可能丢失: 68 个块中的 4,925 个字节 ==8223== 仍然可访问:274 个块中的 47,851 个字节 ==8223== 抑制:0 个块中的 0 个字节 ==8223== 可访问块(找到指针的块)未显示。 ==8223== 要查看它们,请使用以下命令重新运行:--leak-check=full --show-reachable=yes ==8223== ==8223== 对于检测到和抑制的错误计数,请使用以下命令重新运行:-v = =8223== 错误摘要:来自 18 个上下文的 18 个错误(抑制:0 来自 0)
    • @nope 您是否尝试在一个完全空的程序上运行 valgrind,该程序立即返回 EXIT_SUCCESS?在内存泄漏方面,你的代码和什么都不做的代码几乎没有区别。
    • 我在这样的程序上运行过,valgrind 的输出是一样的。那么为什么 valgrind 会报告内存泄漏呢?我怎么知道是否存在真正的内存泄漏?
    【解决方案2】:

    0123456789正在检查内存泄漏...

    实际泄漏报告(实际泄漏:0 总大小:0 字节)

    可能的泄漏报告(可能的泄漏:0 总大小:0 字节)

    执行完成,退出码为0

    这是内存检查报告。没有内存泄漏。此外,仅当您手动分配内存时才应使用 free,否则不应使用 free。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-27
      • 2010-11-11
      相关资源
      最近更新 更多