[英]How to free memory allocated in a function
正如本主题的主题。 我有一个简单的功能:
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
指向的字符串的长度。)
首先, sizeof()
是一个运算符,它在方括号中为您提供一个长度(以字节为单位)的类型(变量类型)。 因此,不是分配的内存块的实际长度,而是指针s
的大小,这通常不是您期望的大小。
第二,当您分配内存时,您应该了解不实际使用内存的时刻,并在其上进行free()
处理。
另外,我不确定5
符号+终止0
是否足以表示字符串的长度,因为在x
中出现乱码的情况下,字符串会更长,因此您可以破坏内存。
最好不要在函数内部分配内存:
char* to_str(char *buffer, size_t buffer_size, int x);
这样,您不必关心函数内部的释放,一切都在调用方。
如果要使用问题中的签名创建函数,则不能在诸如printf("%s", to_str(x))
类的printf("%s", to_str(x))
使用该printf("%s", to_str(x))
,因为这将导致内存泄漏。 您必须将char *str = to_str(x); printf("%s", str); free(str);
char *str = to_str(x); printf("%s", str); free(str);
不好
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.