2013-03-20 137 views
1

讓我們假設我有以下的C代碼:是否需要釋放函數返回的變量的內存(C)?

void myfunction() { 
    time_t  t = 0; 
    struct tm *ct; 

    time(&t); 
    ct = localtime(&t); 
} 

正如你所看到的,localtime函數返回一個新的指針struct tm變量。據我所知,從一個函數返回的變量是在它需要滿足以下的至少一個呼叫者上下文中有效:

  1. 返回的變量必須在調用者的上下文中聲明或更高的情況下與來電者有關。
  2. 返回的變量必須在堆上有分配的內存。

在我的情況下,第一點不適用,所以認爲第二個是完成是正常的。

我對不對?

如果是,是否意味着我需要在使用ct後調用free變量?

如果不是,你可以詳細一點嗎?

謝謝!


編輯:

從反應,予理解的是,應該有一個變量爲可用在上下文其中返回的要求的另一點。這應該是靜態變量。還有另一種可能嗎?

+3

這取決於。你閱讀文檔,然後,你會知道的。多數情況下,沒有。 – 2013-03-20 07:16:51

+1

其他可能性比較模糊,但嚴格來說,內存映射文件並非從堆中分配,而是仍然可以訪問。而且,在嵌入式世界中,可能會有與物理硬件相對應的內存地址。 – rra 2013-03-20 20:56:58

回答

2

一些舊的C函數返回指向靜態緩衝區的指針。 localtime就是其中之一。您不需要(並且實際上不應該;如果您這樣做,您可能會將程序段錯誤)從localtime中釋放返回的指針。

問題是在進程空間中有一個且僅有一個localtime緩衝區,下一個調用localtime(即使在另一個線程中)將覆蓋先前返回的結果。這就是爲什麼幾乎所有表現如此功能的函數(strtok是另一個示例)現在都有新的_r版本,它們將結果放入用戶傳入的緩衝區中,因此是線程安全的。

1

不,你並不需要釋放它:

返回值指向內部的對象,其有效性或 值可以通過任何後續調用gmtime的或本地時間來改變。

Source

換句話說,如果你想保存這個函數的返回值,您應該手動保存到其他地方了。

1

man localtime逐字在Linux上:

四個功能asctime()的ctime(),gmtime的()和localtime()返回一個指向靜態數據,因此不是線程安全的。

因此,不需要免費獲得localtime()返回的值,甚至更多的你甚至不會嘗試釋放它。

OT:爲了保持線程安全手冊頁指出:

線程安全的版本asctime_r(),ctime_r(),gmtime_r()和則localtime_r()由 SUSv2指定,並可以自libc 5.2.5。

+0

如果我調用'localtime_r'而不是'localtime',這是否意味着我需要在不再需要返回值時調用'free'? – artaxerxe 2013-03-20 07:26:39

+0

@artaxerxe用'struct tm * localtime_r(const time_t * timep,struct tm * result);'返回的值指向調用者提供的緩衝區作爲附加的第二個參數。所以如果'free()'的結果是必要的,取決於緩衝區是如何被分配的。 – alk 2013-03-20 07:33:17

+0

我請你原諒。我缺乏文檔。感謝耐心。:) – artaxerxe 2013-03-20 07:37:52

相關問題