2013-04-21 62 views
0

正如本主題一樣。我有一個簡單的功能:如何釋放在功能中分配的內存

char *to_str(int x) 
{ 
    char *s = malloc(6); 

    if (s == NULL) { 
     error("malloc"); 
    } 

    snprintf(s, sizeof(s), "%d", x); 
    return s; 
} 

這是在其體內分配內存,並返回這樣的值。我應該如何處理內存釋放?最好的方法是什麼?

+1

你用'malloc'分配的東西你可以用'free'來釋放。 – 2013-04-21 12:38:06

回答

4

我應該如何處理內存釋放?

小心。絕對比你現在做得更好。

什麼是最好的方法?

最好的辦法是free()當你不再需要它的內存:

char *str = to_str(1337); 
// do stuff with `str' 
free(str); 

同樣,sizeof()是錯誤的。它給你一個指針的大小,而不是緩衝區的大小。你需要自己跟蹤它。

+1

你的回答讓我想起湯姆萊勒的LY Song。 (+1) – NPE 2013-04-21 12:40:38

+0

@NPE謝謝。我不得不查看那首歌,而且確實有一些相似之處。 – 2013-04-21 12:42:09

+0

個人而言,我不喜歡寫「sizeof()'」(帶圓括號),因爲它看起來像一個函數。爲什麼不「'sizeof'」?但無論如何+1。 – md5 2013-04-21 12:59:01

1

調用代碼需要使用free()釋放內存:

void f(int x) 
{ 
    char *s = to_str(x); 
    // ... 
    free(s); 
} 

(順便說一句,你有一個錯誤:在to_strsizeof(s)是一個指針的大小,而不是字符串的長度s指向。)

+0

但它是char *(函數)... 這個問題看起來更確切地問,哪裏是最好的想法來釋放... – 2013-04-21 12:37:21

+0

@ V-X你甚至在談論什麼?這個答案是正確的! – 2013-04-21 12:38:59

+0

@ V-X:我不理解你的評論和你的失望 - 你能否更詳細地解釋我誤解的地方? – RichieHindle 2013-04-21 12:39:30

0

首先,sizeof()是一個運算符,它給出了括號中類型(變量類型)的字節長度。因此,而不是分配的內存塊的實際長度,您得到的指針s的大小,這通常不是你所期望的。

第二,當你分配內存時,你應該明白它沒有被實際使用的時刻,並且在其上製作free()

另外,我不知道,5符號+終止0是字符串的長度不夠,如在x垃圾的情況下,字符串將是更長的時間,所以你可能會破壞內存。

0

最好不分配內存內部功能:

char* to_str(char *buffer, size_t buffer_size, int x); 

這樣你就不必關心函數內釋放,一切都在發送方。

如果你想用你在問題中的簽名來創建函數,你不能在printf("%s", to_str(x))之類的東西中使用它,因爲這會是內存泄漏。你必須製作char *str = to_str(x); printf("%s", str); free(str);這是不好的...