2013-04-21 26 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);这是不好的...