【发布时间】:2019-05-27 17:04:41
【问题描述】:
有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.
我认为为任何malloced 内存提供清理功能会很方便。不得不规避铸造问题,我想出了以下实现:
#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 ** 指定为参数类型,而是强制转换为它。
我想知道,它是否有一些我现在看不到的问题。
【问题讨论】:
-
看不懂
void *mem = *(void **)pmem;的意思。 -
您能解释一下您为什么要使用它吗?在函数结束之前添加一些拆解代码并不是很难。
-
@Cheatah,它在这么简单的函数中用处不大,而是在具有多个退出点的函数中有用。在这种情况下,您不需要在每个点手动调用清理函数。
-
@EugeneSh。我将
void *转换为void **并取消引用它 -
stackoverflow.com/questions/34574933/…第二个回答同意这种做法。