[英]How does GNU C extension __attribute__(__cleanup__) work?
[英]Why gnu extension cleanup work with no parameter
最近,我讀的文章有關使用清理屬性在GNU C里用C實現智能指針++。
#define autofree __attribute__((cleanup(free_stack)))
__attribute__ ((always_inline))
inline void free_stack(void *ptr) {
free(*(void **) ptr);
}
並使用示例:
int main(void) {
autofree int *i = malloc(sizeof (int));
*i = 1;
return *i;
}
我的問題是:
為什么我們不需要將參數傳遞給free_stack
?
為什么free(*(void **) ptr)
工作? 我不知道為什么它會轉換為void**
並取消引用它。
下面是這個屬性的定義:
cleanup (cleanup_function)
當變量超出范圍時,cleanup 屬性會運行一個函數。 此屬性只能應用於自動函數作用域變量; 它可能不適用於具有靜態存儲持續時間的參數或變量。 該函數必須接受一個參數,一個指向與變量兼容的類型的指針。 函數的返回值(如果有)被忽略。
您不需要將參數傳遞給free_stack()
,因為只要該自動變量超出范圍並將指向該變量的指針作為參數,就會調用它。
由於您使用malloc()
分配內存,因此您將擁有一個需要釋放的指針。 因此,傳遞給清理函數的參數實際上是指向指針(或void**
)的指針,然后您需要使用(*(void**)ptr)
來到達您需要釋放的指針。 在您的代碼中,您可以認為以下代碼在i
超出范圍時運行:
free_stack(&i);
更新:
請記住,清理功能並不意味着釋放內存。 這意味着清理。 例如,您可以使用以下清理方法在超出范圍時關閉文件:
#define autoclose __attribute__((cleanup(auto_close_file)))
__attribute__ ((always_inline))
inline void auto_close_file(void *ptr) {
fclose(*(FILE**) ptr);
}
int main(void) {
autoclose FILE *fp = fopen("test.txt", "w");
fputs("Hello World", fp);
return 0;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.