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