如何释放需要从函数返回的双指针?

How to free a double pointer that need to be returned from the function?

例如,这是一个名为 fnx.c 的函数文件的代码,其中 func() 将从主函数调用。我应该如何释放TempArray,同时return指向主函数的双指针?

    int * * TempArray; //global variable in this file

static void CreatePointer(int row, int col) {
    int r;
    TempArray = malloc(sizeof(int * ) * (row));
    for (r = 0; r < row; r++) {
        TempArray[r] = malloc(sizeof(int) * (col));
    }
}


static void DestroyPointer() {
    free(TempArray);
    TempArray = NULL;

}

int * * func(int * * OriArray, int row, int col, int r_offset, int c_offset) {
    int r, c;

    CreatePointer(row, col);

    for (r = 0; r < row; r++) {
        for (c = 0; c < col; c++) {
            TempArray[r][c] = OriArray[r + r_offset][c + c_offset];
        }
    }

    //destroy TempArray??

    return TempArray;

}
  1. 在你的 main() 中调用 CreatePointer()
  2. 在你的 main() 中调用 func()
  3. func() 之外,当您不再需要 TempArray 时,请致电 DestroyPointer()

而你的 DestroyPointer() 是错误的。你会有内存泄漏。它应该是这样的:

static void DestroyPointer (int row)
{
    for (int r = 0; r < row; r++)
    {
       free(TempArray[r]); 
    }
    free(TempArray);
}

您应该在释放 TempArray 之前释放所有行。

static void DestroyPointer (int row)
{
   for (int r = 0; r < row; r++)
   {
      free(TempArray[r]);
   }
   free(TempArray);
   TempArray = NULL;

}

但是你不应该在返回之前销毁指针,
因为在 main 之后取消引用它会导致未定义的行为。

如果在主函数调用后要使用这个点(TempArray),不能销毁它(TempArray)。只有当你不想使用这个点数据时,才可以销毁它。 你可以这样测试:

main()   
{   
  int *p = func(oriArray,row,col,r_offset,c_offset);   

   for (int r = 0; r < row; r++){   
       for(int c = 0; c < col; c++){   
         printf("%d",p[r][c]);   
      }   
   }      

  DestroyPointer();   
}

希望对您有所帮助!