如何释放函数中分配的内存

时间:2013-04-21 12:35:15

标签: c unix memory malloc free

与本主题一样。我有一个简单的功能:

char *to_str(int x)
{
    char *s = malloc(6);

    if (s == NULL) {
        error("malloc");
    }

    snprintf(s, sizeof(s), "%d", x);
    return s;
}

在其正文中分配内存,并返回此值。我该如何处理内存释放?什么是最好的方法?

4 个答案:

答案 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);不好......