2012-11-09 28 views
1

我有以下函數獲取我的代碼中多次調用:修復內存泄露

char* get_section_name(const char* section, const char* value) { 

    char *tmp = (char *)malloc(STR_LEN * sizeof(char)); 

    if(strlen(section)>0) { 

     strcat(tmp, section); 

     strcat(tmp,"."); 

    } 

    strcat(tmp, value);  

    return tmp; 

} 

,我把它在其他功能上是這樣的:

section_name = get_section_name(data->model_name,"params_default"); 

什麼是最好的方式釋放這個記憶?完成後,我可以撥打free(section_name)嗎?

+1

'的strcat( tmp,section)'假設'tmp'包含一個字符串。它不是。 – ouah

+0

供參考:http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc - 剛纔看到這個,對我來說是新聞! – weston

回答

1

free,但是,您可以考慮一個不同的名稱,使其清楚分配內存。此外,您可以使用sprintf來組合2個字符串,並使用strdup來複制一個。

char* create_section_name(const char* section, const char* value) { 
    const int sectionLen = strlen(section); 

    if(sectionLen>0) { 
     //+1 for the period and +1 for the null 
     char *tmp = (char *)malloc((sectionLen + strlen(value) + 2) * sizeof(char)); 
     //do that often? consider a newString(size) macro. See below 
     sprintf(tmp, "%s.%s", section, value);  
     return tmp; 
    } 
    else {  
    return strdup(value); 
    } 
} 

這是假設你不需要滿STR_LEN,它採用剛好夠在這兩種情況下。

newString宏觀,我建議:

#define newString(size) (malloc((size) * sizeof(char))) 

或者,它甚至可以自動添加一個空:

​​

然後的malloc替換爲:

char *tmp = newString(sectionLen + strlen(value) + 1); //+1 for period 
0

使用malloc()calloc(),或realloc()

創建內存時,一定要進行錯誤檢查是的,你可以使用free這裏

free(section_name),因爲tmp返回的存儲在section_name現在指向malloc內存。

1

首先,你必須確保tmp實際分配(即malloc沒有失敗):

tmp = (char *)malloc(STR_LEN * sizeof(char)); 
if (tmp == NULL) { 
    // quit now ! 
} 

然後,當你strcat它,你必須確保tmp是一個空字符串,即它的第一個字符是0

tmp[0] = '\0'; 

然後,是的,你可以按照你寫的方式釋放它。

最後一件事:你必須確定​​,否則你會覆蓋你不應該寫的內存。

0

我要做出一個信念的飛躍,STR_LEN將有足夠的規模。如果是這樣,那麼free(section_name);就足夠了。 Bur使用strcpy而不是strcat或初始化一個空字符串。

1

free在這裏會很棒,但作爲替代方案,可能是做到這一點的最佳方式是更改簽名。如果你把它像

void get_section_name(const char* section, const char* value, char * result) 

那麼你可以傳遞一個指向分配的內存,所以這個功能的用戶是完全知道的,他應該如何處理存儲它的使用之後。

+0

這確實是一個很好的觀點。也許那麼函數可以返回'void',或者某個值來表示失敗的東西(例如,調用'malloc')。 – Fabien

+0

當然,它應該返回void,複製粘貼錯誤,現在已經修復! Thanx @Fabien! –