簡體   English   中英

在 C 中返回 static arrays 以避免 ZCD69B4957F06CD818DZB3D61 泄漏是一種好習慣嗎?

[英]Is it good practice to return static arrays in C to avoid memory leaks?

我對使用 static arrays 作為函數中的返回值來避免相當復雜的使用free()有一些疑問。

我負責解決 C 程序中的一些 memory 泄漏。 當直接將宏作為 function 參數調用時,就會發生這些泄漏:

snprintf( ..., MACRO, ...);

當滿足某些條件時,此宏調用一個 function 使用malloc()分配 memory:

#define MACRO ({ \
    char * problematicVariable = ... ? problematicFunction(NULL) : fixedValue; \
    // Some if statements... 
    problematicVariable; \
})

promlematicFunction()MACRO在程序中實現的方式使得無法正確釋放 memory 除非進行大量更改,因此我碰巧找到的解決方法是在復制 memory 后直接在problematicFunction()中釋放它static 數組中的值:

char *problematicFunction(char *arg) 
{
    char *buff = malloc(PATH_MAX);
    static char temp[PATH_MAX];

    // Doing stuff with buff...

    if (strlcpy(temp, buff, sizeof(temp)) >= sizeof(temp))
    {
        // Handle error...
    }

    free(buff);
    return(temp);
}

這樣的事情可以被認為是好的做法嗎? 返回值應該是只讀的。

提前致謝!

這取決於上下文。 在大多數托管系統中,不贊成使用具有 static 存儲持續時間的內部變量,或返回指向它們的指針。 因為這使得函數不適合多線程 - 它們不是線程安全的,除非您明確添加互斥鎖或類似機制。 如果可能的話,編寫 function 可重入,調用者分配和沒有全局資源等被認為是最佳實踐。

當然,如果 function 沒有重置 static 存儲資源,則只能調用一次。 這對於“單例”設計模式是有意義的,但對於通用庫則不然。

然而,在獨立(嵌入式等)系統中,您經常使用 static memory 池,因為此類系統通常是單線程的,並且還禁止使用堆分配。

通常,如果執行 malloc malloc代碼模塊也是負責清理自己的爛攤子的代碼模塊,則使用 malloc 的代碼是正確編寫的,通過提供 function 調用是所有必要的free()調用。 對於每個 malloc 調用,應該有一個相應的免費調用,在相同的代碼中。 這也適用於所有其他動態資源,文件句柄,線程等。

過去約 40 年的 C 編程歷史表明 memory 泄漏最常出現在您提出功能失調的庫 API(例如 POSIX getline )時,其中調用者負責手動清理庫分配的內容。 如果庫改為使用具有私有封裝的正確設計,則不應發生 memory 泄漏。

Now of course C doesn't have RAII or destructors, so instead C programmers using a library must be trusted to activate their brain and call a function foo_cleanup() if the "foo library" provides that one and tells the programmer to call it when他們是使用資源完成的。

返回 static 緩沖區是可以的,但僅限於單線程環境。 標准 C 庫中的許多函數都是以這種方式實現的(例如 strerror 函數)。 如果要使它們成為線程安全的,則必須將緩沖區作為參數傳遞給 function (strerror_r)。 在這種情況下,調用者是否在 static、動態 memory 或堆棧上分配緩沖區(這非常靈活,但要注意嵌入式系統上的堆棧溢出:))。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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