繁体   English   中英

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

[英]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_strsizeof(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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM