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

3

这是我正在处理的内容:

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

}

有没有一种方法可以一次性释放这个数组所分配的所有内存?
谢谢。

你事先知道内存单元需要多大吗? - Anycorn
3个回答

13

不使用标准的malloc()分配器 - 您需要调查内存池的使用。这些通过预先分配一个大块内存,通过它们自己的分配函数进行分配和释放,并通过特殊的“全部释放”函数释放整个块。

我必须说,我总是觉得这些东西有点丑陋 - 写出不泄漏的代码并不难。我唯一能想到使用它们的原因是为了缓解堆碎片问题,如果这对您来说是真正的问题。


6
没有。单独分配的内存必须单独释放。
唯一可以一次性释放它的方法是,如果你一开始分配了一个巨大的块。然后你需要做一些指针运算来为每一行分配正确的索引到数组中,但这并不是非常困难。但这种方法确实有一些缺点:
  1. 额外的指针运算
  2. 需要一个巨大的连续内存块,而不是N个小内存块。在低内存或高碎片化环境下可能会有问题。
  3. 额外的工作,没有真正的收益。

5
如果您想一次性释放它,就必须一次性分配所有内存。
一个简单的手动解决方案是,如果您事先知道所需的总大小,可以一次性分配所有内存块并根据需要进行索引。如果您不知道大小,可以使用realloc来增加内存,只要您仅从初始指针进行索引访问它,而且没有把其他指针存储在任何地方。
话虽如此,直接分配和释放内存是一个简单的解决方案,并且比替代方案更难出错。除非释放循环给您带来实际困难,否则建议您继续使用当前的方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接