【问题标题】:Dynamic memory allocation in for loopfor循环中的动态内存分配
【发布时间】:2013-07-29 06:28:44
【问题描述】:

我正在使用malloc分配内存:

 main()
{
   int *array;
   int i;
   for(i = 0; i<40; i++)
   {
     array = malloc(100 * sizeof(int));
   }
   free(array);
}

这应该分配15.625KB,但如果我在valgrind 中运行它,峰值内存是15.92KB
它是怎么来的?

如何释放所有 40 个指针?

【问题讨论】:

  • 可能是堆碎片
  • 我认为分配了超过 400 个字节,即每个 malloc 调用应该分配 408 个字节。也许像 next/prev 指针这样的内部堆数据?
  • 您的代码包含一个错误:您必须保留从 malloc 返回的每个指针并单独释放该指针。您只是释放最后一个指针。这会导致先前分配的 39 个指针导致内存泄漏。
  • 如果您尝试调整当前分配的内存大小,您应该使用 realloc。 Malloc 将分配新的内存,正如 CouchDeveloper 所说,以前分配的内存在您当前的代码中不再可访问,因此永远不会被释放。

标签: c malloc dynamic-memory-allocation


【解决方案1】:

至少 - 每个分配块的大小需要存储在某个地方,通常还存储一些指针(例如,指向下一个已分配/空闲块),并且在某些情况下(例如调试构建),还需要额外的调试信息存储。大多数实现在未分配空间中存储尽可能多的信息,因此每个分配的块中只会存储几个字节(例如大小)。

至于碎片,许多实现具有最小分配大小或四舍五入请求的大小以保持某种对齐。

【讨论】:

    【解决方案2】:

    关于释放所有 40 个指针,例如,您可以拥有一个指针数组,其中包含从 malloc 返回的指针,并在函数结束时遍历它。

    类似的东西:

    main()
    {
       int *arrays[40];
       int i;
       for(i = 0; i<40; i++)
       {
         arrays[i]=malloc(100 * sizeof(int));
       }
    
       for(i = 0; i<40; i++)
       {
         free(arrays[i]);
       }
    }
    

    【讨论】:

    • 对不起,我看不懂C++
    • 切换到 C 示例
    【解决方案3】:

    free (array) 应该在循环内释放所有指针而不是只释放最后一个。

    【讨论】:

      【解决方案4】:

      当你调用 malloc() 时,实际使用的内存量比请求的稍多。这个额外的包括记录块有多大、下一个空闲块在哪里可用等信息。

      这个额外的信息是 free() 函数知道要释放多少的原因。

      【讨论】:

        猜你喜欢
        • 2015-08-10
        • 2016-09-05
        • 2018-11-13
        • 2019-03-31
        • 1970-01-01
        • 1970-01-01
        • 2021-03-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多