通用函数释放C中具有cleanup属性的2d数组

时间:2018-11-20 20:24:50

标签: c arrays attributes malloc free

我最近发现了__attribute__((cleanup))这很方便。我已经做了一个泛型函数来释放任何类型的指针,并且可以正常工作。

#define _autofree_ __attribute__ ((cleanup(free_pointer)))

...

void free_pointer(void *pointer)
{
    free(*(void **) pointer);
}

但是要释放2d数组并不是那么容易。据我所知,出于堆栈限制的原因,cleanup使用指向给定指针的指针,这是一件好事,因为它在任何时候都不使用它的 copy 。无论如何,取消引用(void **)强制转换以通过“ derefencing void *”错误是可行的,但如果我这样做

#define _autofree2d_ __attribute__ ((cleanup(free_pointer_array)))

...

void free_pointer_array(void *pointer_array)
{
    for (size_t i = 0 ; (void **) pointer_array[i] ; ++i)
        free(*(void **) pointer_array[i]);
    free(*(void ***) pointer_array);
}

由于括号[i],我最终取消引用void *。同样,这看起来并不正确。

我还尝试使用char指针以一种不太通用的方式进行此操作(因为我目前正在使用word数组),它可以编译,但由于无效的free而给我们一个段错误。

void free_pointer_array(char ***array)
{
    for (size_t i = 0 ; *array[i] ; ++i)
        free(*array[i]);
    free(**array);              // Tried using ***array and got
                                // "pointer from integer without a cast" error
}

1 个答案:

答案 0 :(得分:0)

正如Andrew Henle在评论中提到的那样,我的分配方法就是问题。我正在制作一个查找表而不是一个实际的2d数组。使用此处描述的方法:Correctly allocating multi-dimensional arrays,我可以简单地将原始的_autofree_宏用于任何尺寸的数组。