与本主题一样。我有一个简单的功能:
char *to_str(int x)
{
char *s = malloc(6);
if (s == NULL) {
error("malloc");
}
snprintf(s, sizeof(s), "%d", x);
return s;
}
在其正文中分配内存,并返回此值。我该如何处理内存释放?什么是最好的方法?
答案 0 :(得分:4)
我应该如何处理内存释放?
小心。而且肯定比你现在做得好。
最好的方法是什么?
当您不再需要时,最好的方法是free()
内存:
char *str = to_str(1337);
// do stuff with `str'
free(str);
此外,sizeof()
是错误的。它给出了指针的大小,而不是缓冲区的大小。你需要自己跟踪它。
答案 1 :(得分:1)
调用代码需要使用free()
释放内存:
void f(int x)
{
char *s = to_str(x);
// ...
free(s);
}
(顺便说一下,你有一个错误:在to_str
中,sizeof(s)
是指针的大小,而不是s
指向的字符串的长度。)
答案 2 :(得分:0)
首先,sizeof()
是一个运算符,它为您提供括号中类型(变量类型)的字节长度。因此,不是分配的内存块的实际长度,而是获得指针s
的大小,这通常不是您所期望的。
第二,当您分配内存时,您应该了解实际使用内存的时刻并在其上进行free()
。
另外,我不确定5
个符号+终止0
是否足够长,因为x
中的垃圾会更长,所以你可以破坏记忆。
答案 3 :(得分: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);
不好......