2015-12-05 22 views
-1

所以這是在x86機器上運行基於Debian的Linux操作系統。我有以下被稱爲很多次的功能。我不知道如果我應該free()temp指針或我可以只是讓它的功能。我應該釋放()用於存儲realloc()結果的臨時指針嗎?

int my_function (char *Data, int Data_size) { 

    void *temp; 
    Data_size = 7000; 

    // Allocate a huge array to store a line of the datalogger 
    // 
    temp = (char *) realloc(Data, Data_size); 
    if (temp == NULL) 
    { 
     printf("Reallocate Data ERROR\n"); 
     free(Data); 
     return -1; 
    } 
    Data = temp; 

    // Do something with the Data 

    return 1; 
} 
+1

你不應該。 'free()'用於告訴操作系統您不再使用具有給定地址的內存。既然你把這段內存給了「數據」,你就不應該釋放它。但是當你在程序的某個部分停止使用「Data」時,你應該調用'free()'。 – TomTsagk

+0

嘿,謝謝。所以如果我在函數內部使用'Data'並且不再需要它,我應該在離開函數之前釋放(Data)和free(temp)? –

+0

數據是一個指針,temp也是一個指針,它們指向同一塊內存,所以你不需要釋放它們兩個。當函數結束時,temp將被銷燬,但它所指向的數據將在內存中保持活動狀態。由於Data指向的是內存塊,因此只有在完成使用'Data'時,才應該調用'free()'。 – TomTsagk

回答

2

由於您使用realloc(不僅僅是malloc),它看起來像Data已經在其他地方分配的,大概是在調用my_function功能。爲了清除任何錯誤概念,Data = temp;分配將不會將realloc獲得的值返回給調用者,因爲char *Data是按值傳遞的。

現在到實際的問題。是否呼叫者預計my_function釋放Data緩衝區?如果realloc失敗,代碼似乎爲free。如果是這樣,那麼如果realloc成功,它應該也可以是free(temp);。因爲


[編輯]爲了強調在評論提出的觀點@mksteve,一旦 realloc成功地 my_functiontemp指針不再必須等於原始 Data,並且原始 Data指針不再有資格成爲 free倒是它可能指向那個時候釋放的數據。由於重新分配的 temp指針是 而不是傳遞迴調用函數,因此調用者在 my_function返回後嘗試 free(Data)將是非法的。

在一般說明中,將事物分配給(重新)分配給同一級別的人,總是比較安全。依賴於調用者分配和被調用者處置是有風險的業務,而不僅僅是這個例子。

+1

是的,你應該釋放它,因爲原始值被realloc破壞(Data'的原始值將是'free'ed)並且新值丟失 - 不會離開函數 – mksteve

+0

只需要清楚。因此,如果調用者期望在發生錯誤時釋放「Data」緩衝區的功能。如果realloc失敗,我應該釋放(Data),如果realloc失敗,我應該釋放(temp)。還有一件事,這是做事的正確方式,還是有更安全的方式來處理這種類型的內存分配? –

+0

'如果realloc失敗,應該釋放(Data),如果realloc成功,則釋放(temp).'這是正確的。另一點是'Data'是按值傳遞的,所以調用者不會收到realloc'd指針。在'my_function'返回後,調用者函數絕對不能嘗試以任何方式使用數據指針。 – dxiv

相關問題