正如本主题一样。我有一个简单的功能:如何释放在功能中分配的内存
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