【问题标题】:Generic function to free 2d arrays with cleanup attribute in C在 C 中释放具有清理属性的二维数组的通用函数
【发布时间】:2018-11-20 20:24:49
【问题描述】:

我最近发现了__attribute__((cleanup)),它非常方便。我做了一个通用函数来释放任何类型的指针,它工作正常。

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

...

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

但在释放二维数组时并不容易。据我所知,出于堆栈限制的原因,清理使用指向给定指针的指针,这是一件好事,因为它在任何时候都不使用它的 copy。无论如何,取消引用 (void **) 强制转换以通过“取消引用 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 指针(因为我目前正在使用单词数组)并且它可以编译但由于无效的 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
}

【问题讨论】:

标签: c arrays attributes malloc free


【解决方案1】:

正如 Andrew Henle 在 cmets 中提到的,我的分配方法是问题所在。我正在制作一个查找表,而不是一个实际的二维数组。使用这里描述的方法:Correctly allocating multi-dimensional arrays,我可以简单地将我原来的_autofree_ 宏用于任何维度的数组。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多