【问题标题】:How can I free all allocated memory at once?如何一次释放所有分配的内存?
【发布时间】:2010-04-26 20:32:42
【问题描述】:

这是我正在使用的:

char* qdat[][NUMTBLCOLS];
char** tdat[];
char* ptr_web_data;

    // Loop thru each table row of the query result set
    for(row_index = 0; row_index < number_rows; row_index++)
    {
        // Loop thru each column of the query result set and extract the data
        for(col_index = 0; col_index < number_cols; col_index++)
        {
            ptr_web_data = (char*) malloc((strlen(Data) + 1) * sizeof(char));
            memcpy (ptr_web_data, column_text, strlen(column_text) + 1);
            qdat[row_index][web_data_index] = ptr_web_data;
        }
     }

    tdat[row_index] = qdat[col_index];

数据用完后,分配的内存使用free()一次释放一个。

for(row_index = 0; row_index < number_rows; row_index++)
{ 
  // Loop thru all columns used
  for(col_index = 0; col_index < SARWEBTBLCOLS; col_index++)
  {
    // Free memory block pointed to by results set array
    free(tdat[row_index][col_index]);
  }

}

对于这个数组,有没有办法一次性释放所有分配的内存?

谢谢。

【问题讨论】:

  • 你提前知道你的记忆细胞有多大吗?

标签: c arrays memory memory-management pointers


【解决方案1】:

不适用于标准 malloc() 分配器 - 您需要调查内存池的使用情况。它们的工作原理是预先分配一大块内存,然后根据您的请求通过它们自己的分配函数从其中分配并释放回它,然后使用特殊的“全部解除分配”函数释放全部。

我必须说我一直觉得这些东西有点难看 - 编写不泄漏的代码真的没那么难。我认为使用它们的唯一原因是减轻堆碎片,如果这对您来说是一个真正的问题。

【讨论】:

    【解决方案2】:

    不,没有。单独分配的内存必须单独释放。

    你可以一次性释放它的唯一方法是,如果你一次分配它是一个巨大的块。然后,您将不得不做一些指针数学运算来为每一行分配正确的索引到数组中,但这并不是非常困难。不过,这种方法确实有一些缺点

    1. 额外的指针数学
    2. 需要一个巨大的连续内存块与 N 个较小的内存块。在低内存或高碎片环境中可能是一个问题。
    3. 额外的工作没有真正的收益。

    【讨论】:

      【解决方案3】:

      如果你想一次全部释放,你必须一次全部分配。

      如果您提前知道所需的总大小,一个简单的手动解决方案是将其全部分配到一个块中并在适当时对其进行索引。如果您事先不知道大小,您可以使用 realloc 来增加内存,只要您只从初始指针索引访问它,并且不要在任何地方存储额外的指针。

      话虽如此,直接分配和释放是一种简单的解决方案,而且比其他方法更难出错。除非解除分配的循环给你带来真正的困难,否则我会坚持你所拥有的。

      【讨论】:

        猜你喜欢
        • 2018-08-27
        • 2021-03-15
        • 1970-01-01
        • 1970-01-01
        • 2020-11-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多