释放为指针指针分配的所有空间,而不知道其类型

时间:2016-10-05 15:37:18

标签: c pointers free

我有一个C程序,它使用了一些指针,例如int **float **double **long **等。最后,我想释放为他们分配的空间。

为了模块化,我有一个函数可以获取指针到指针形式的对象并释放为它分配的内存空间。例如,对于int **类型的变量,以下内容。

void FreeIntArray(int **A, int length){
    int i;
    for (i = 0; i < length; i ++)
       free(A[i]);
    free(A);
}

但是,要释放float **double **形式的变量,我需要编写另一个函数,该函数几乎是上述函数的副本,除了将int **更改为{函数定义中的{1}}。

是一种设计单个函数的方法,可以释放分配给以下任何数据类型的空间:float **int **float **double **

1 个答案:

答案 0 :(得分:7)

如果您想要严格遵守ISO C标准对最大可移植性的定义,那么没有重复编码就无法做到这一点。我们可以将逻辑转换为单个函数,但是该函数需要在指示类型的整数变量上进行某种切换,因此它可以正确地访问type **指针作为正确的类型。

我们可以放弃最大可移植性并假设所有指针具有相同的表示。 (另外假设我们不会被优化编译器中的严格别名假设所困扰。)然后我们可以这样写:

void free_array(void *aptr, size_t nelem) {
    void **a = (void **) aptr;
    while (nelem--)
      free(*a++);
    free(aptr);
}

另一种选择是使用宏:

#define GEN_AFREE(name, type)                   \
   void afree_ ## name (type **a, size_t nelem) \
   {                                            \
     [...]                                      \
   }

GEN_FREE_ARRAY_FUN(int, int)
GEN_FREE_ARRAY_FUN(double, double)
GEN_FREE_ARRAY_FUN(string, char)

或者代替定义宏,我们可以创建一个封装循环数组并调用free的宏:

#define FREE_ARRAY(array, size) do {         \
  size_t iNdEx;                              \
  for (iNdEx = 0; iNdEx < (size); iNdEx++)   \
    free((array)[iNdEx]);                    \
  free(array);                               \
} while (0)