如何一次释放所有已分配的内存?

时间:2010-04-26 20:32:43

标签: c arrays memory memory-management pointers

以下是我的工作内容:

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]);
  }

}

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

谢谢。

3 个答案:

答案 0 :(得分:13)

不使用标准的malloc()分配器 - 您需要调查内存池的使用。这些工作通过预先分配大块内存,从中分配并在您通过自己的分配函数请求时释放回来,然后使用特殊的“释放全部”功能释放整个批次。

我必须说我总是发现这些东西有点难看 - 编写不泄漏的代码真的不难。我可以看到使用它们的唯一原因是缓解堆碎片,如果这对您来说是一个真正的问题。

答案 1 :(得分:5)

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

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

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

答案 2 :(得分:5)

如果您想一次性全部发布,则必须立即全部分配。

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

话虽如此,直接分配和解除分配是一个简单的解决方案,并且比其他方案更难以出错。除非解除分配的循环导致你真正遇到困难,否则我会坚持你拥有的东西。