簡體   English   中英

為什么 gnu 擴展清理工作沒有參數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM