2014-03-28 37 views
2

說我有以下功能:如何釋放將被返回的char *?

char* fakeTrim(char* input) { 
    char* temp = malloc(strlen(input)); 
    int count = 0; 
    for(int i = 0; i < strlen(input); i++) { 
     if(input[i] != ' ') 
      temp[count++] = input[i]; 
    } 
    temp[count] = '\0'; 
    return temp; 
} 

是否臨時造成任何內存泄露? 如果是這樣,是否有可能在我們返回溫度之前釋放它?

謝謝!

+0

是的,它會導致內存泄漏,你可以釋放它的調用者fakeTrim(),當你感覺它已不再是必需的。 – user207064

回答

0

不,當然也可以不屬於您傳回數據的可用內存。實際上,在這樣的效用函數中分配內存使內存泄漏極有可能;因爲調用者不會看到函數體,所以她很容易忘記釋放它。有一個標準的解決這個問題其實,這是使呼叫者分配內存自言自語:

void fakeTrim(const char* input, char* temp) { 
    int count = 0; 
    for(int i = 0; i < strlen(input); i++) { 
     if(input[i] != ' ') 
      temp[count++] = input[i]; 
    } 
    temp[count] = '\0'; 
} 

現在內存泄漏仍然是可能的,但它不是「你的錯」 - 來電者應該知道免費記憶,他分配。注意在簽名中加入const使得輸入哪個參數,哪個輸出清楚。

編輯:這裏有一個用例:

const char* input = "Hello world"; 
char* temp = malloc(strlen(input)+1); 
fakeTrim(input, temp); 
// ... do something with temp 
free(temp); 
+0

調用者將如何完全釋放內存泄漏?說出char * str = fakeTrim(「hello」); free(str); ? – user3471059

+0

@ user3471059我添加了一個調用者如何使用它的例子。但基本上,是的,對'free'的調用會在'temp'被用於任何目的之後。 –

+0

因爲'fakeTrim'從不添加字符,所以另一種選擇是將其置於原地。 '無效fakeTrim(字符* input_and_output)' –

3

不行,你只能釋放分配的內存,當你不再需要引用它,這意味着調用者需要釋放返回的值(你應該爲函數的文檔中提到這一點)。

順便說一下,如果輸入字符串中沒有空格,那麼最後將在temp[count] = '\0';上出現一個超出範圍的數組引用,所以您應該再分配一個字節。 (和trim通常不刪除內部空間,但也許這就是爲什麼你叫它fakeTrim

0

是的,的確會臨時導致內存泄漏。

然而,我有你的一個要求的替代解決方案。 您可以通過使用通過引用傳遞使用在調用函數動態可變的,後來從調用函數本身(無需從被調用函數釋放它)釋放它。請看下面:

void main() 
{ 
     char *test; 

     setVal(test); 
     puts(test); 
     if(test){ 
       free(test); 
       test = NULL; 
     } 
} 
void setVal(char **data) 
{ 
     char retry[100]="This is test"; 
     char *ret; 

     ret = malloc((strlen(retry))*sizeof(char)); 
     if(ret == NULL) 
       exit(1); 
     strncpy(ret, retry, strlen(retry)); 

     *data = ret; 
} 

如果你還不滿意。使用我用VALGRIND提供的示例代碼來查看是否有任何內存泄漏。

希望它有幫助。