Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何一次释放所有分配的内存?_C_Arrays_Memory_Memory Management_Pointers - Fatal编程技术网

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

C 如何一次释放所有分配的内存?,c,arrays,memory,memory-management,pointers,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 resul

以下是我的工作内容:

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];
char*qdat[][NUMTBLCOLS];
字符**tdat[];
char*ptr_web_数据;
//循环遍历查询结果集的每个表行
对于(行索引=0;行索引<行数;行索引++)
{
//循环遍历查询结果集的每一列并提取数据
对于(列索引=0;列索引
使用数据后,使用free()一次释放一个分配的内存

for(行索引=0;行索引
对于这个阵列,有没有一种方法可以一次释放所有分配的内存


谢谢。

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


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

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

你能一次释放它的唯一方法是,如果你立即分配它,那就是一个巨大的区块。然后,您需要做一点指针数学,将每一行的正确索引分配到数组中,但这并不十分困难。不过,这种方法确实有一些缺点

  • 额外指针数学
  • 需要一个巨大的连续内存块,而不是N个较小的内存块。在低内存或高碎片环境中可能会出现问题
  • 额外的工作没有实际的收益
    如果你想一次全部释放它,你必须一次分配它

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


    也就是说,直接分配和解除分配是一个简单的解决方案,而且比其他方案更难出错。除非取消分配的循环给您带来了真正的困难,否则我会坚持您现有的。

    您提前知道您的内存单元必须有多大吗?
    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]);
      }
    
    }