分配的内存的通用清除属性

时间:2019-05-27 17:04:41

标签: c gcc

GCC-specific attribute cleanup。可能会这样使用:

#define SCOPED_FILE __attribute__((cleanup(cleanup_file)))

void
cleanup_file(FILE **file) {
    if (*file != NULL) { fclose(*file); }
}
…
FILE *SCOPED_FILE file = fopen(…); // file will be closed at the end of scope.

我认为为所有malloc内存提供清理功能会很方便。为了避免投放问题,我想出了以下实施方案:

#define SCOPED_MEM __attribute__((cleanup(cleanup_mem)))

static inline void
cleanup_mem(void *pmem) {
    void *mem = *(void **)pmem;
    free(mem);
}

int main(void) {
    char *SCOPED_MEM str = malloc(20);
    strcpy(str, "pineapple");
    printf("hi, %s\n", str);
    // str will be free'd at the end of scope
}

它确实有效,但闻起来很有趣,因为我没有直接将void **指定为参数类型,而是将其强制转换为参数类型。 我想知道,是否存在一些我现在看不到的问题。

1 个答案:

答案 0 :(得分:1)

  

但是有点可笑,因为我没有直接将void **指定为参数类型,而是将其强制转换为参数类型。

C语言中的投放通常是代码的味道,因此您应该问自己:为什么必须进行投放?

第一个方法可能是:

static inline void
cleanup_mem(void **pmem) {
    free(*mem);
}

但是编译器不允许您将T**隐式转换为void**,因为严格来说,it's not necessarily safe

cleanup_mem接受void*并在内部强制转换为void**不会使转换更加安全。