有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 **
指定为参数类型,而是将其强制转换为参数类型。
我想知道,是否存在一些我现在看不到的问题。
答案 0 :(得分:1)
但是有点可笑,因为我没有直接将
void **
指定为参数类型,而是将其强制转换为参数类型。
C语言中的投放通常是代码的味道,因此您应该问自己:为什么必须进行投放?
第一个方法可能是:
static inline void
cleanup_mem(void **pmem) {
free(*mem);
}
但是编译器不允许您将T**
隐式转换为void**
,因为严格来说,it's not necessarily safe。
让cleanup_mem
接受void*
并在内部强制转换为void**
不会使转换更加安全。