正如本主題一樣。我有一個簡單的功能:如何釋放在功能中分配的內存
char *to_str(int x)
{
char *s = malloc(6);
if (s == NULL) {
error("malloc");
}
snprintf(s, sizeof(s), "%d", x);
return s;
}
這是在其體內分配內存,並返回這樣的值。我應該如何處理內存釋放?最好的方法是什麼?
正如本主題一樣。我有一個簡單的功能:如何釋放在功能中分配的內存
char *to_str(int x)
{
char *s = malloc(6);
if (s == NULL) {
error("malloc");
}
snprintf(s, sizeof(s), "%d", x);
return s;
}
這是在其體內分配內存,並返回這樣的值。我應該如何處理內存釋放?最好的方法是什麼?
我應該如何處理內存釋放?
小心。絕對比你現在做得更好。
什麼是最好的方法?
最好的辦法是free()
當你不再需要它的內存:
char *str = to_str(1337);
// do stuff with `str'
free(str);
同樣,sizeof()
是錯誤的。它給你一個指針的大小,而不是緩衝區的大小。你需要自己跟蹤它。
調用代碼需要使用free()
釋放內存:
void f(int x)
{
char *s = to_str(x);
// ...
free(s);
}
(順便說一句,你有一個錯誤:在to_str
,sizeof(s)
是一個指針的大小,而不是字符串的長度s
指向。)
但它是char *(函數)... 這個問題看起來更確切地問,哪裏是最好的想法來釋放... – 2013-04-21 12:37:21
@ V-X你甚至在談論什麼?這個答案是正確的! – 2013-04-21 12:38:59
@ V-X:我不理解你的評論和你的失望 - 你能否更詳細地解釋我誤解的地方? – RichieHindle 2013-04-21 12:39:30
首先,sizeof()
是一個運算符,它給出了括號中類型(變量類型)的字節長度。因此,而不是分配的內存塊的實際長度,您得到的指針s
的大小,這通常不是你所期望的。
第二,當你分配內存時,你應該明白它沒有被實際使用的時刻,並且在其上製作free()
。
另外,我不知道,5
符號+終止0
是字符串的長度不夠,如在x
垃圾的情況下,字符串將是更長的時間,所以你可能會破壞內存。
最好不分配內存內部功能:
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);
這是不好的...
你用'malloc'分配的東西你可以用'free'來釋放。 – 2013-04-21 12:38:06