簡體   English   中英

釋放為指針指針分配的所有空間,而不知道其類型

[英]Free all the space allocated for a pointer-to-pointer, without knowing its type

我有一個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 **更改為float **

是一種設計單個函數的方法,可以釋放分配給以下任何數據類型的空間: int **float **double **long **

如果您想要嚴格遵守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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM