【问题标题】:How to free memory allocated in a function如何释放函数中分配的内存
【发布时间】:2013-04-21 12:35:14
【问题描述】:

正如本主题的主题。我有一个简单的功能:

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

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

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

在它的主体中分配内存,并返回这样的值。我应该如何处理内存释放?最好的方法是什么?

【问题讨论】:

  • 你用malloc分配的东西你应该用free释放。

标签: c unix memory malloc free


【解决方案1】:

我应该如何处理内存释放?

小心。而且绝对比你现在做得更好。

最好的方法是什么?

最好的办法是在你不再需要的时候free()内存:

char *str = to_str(1337);
// do stuff with `str'
free(str);

另外,sizeof() 是错误的。它为您提供指针的大小,而不是缓冲区的大小。您需要自己跟踪。

【讨论】:

  • @NPE 谢谢。我不得不查那首歌,确实有一些相似之处。
  • 我个人不喜欢写“sizeof()”(带括号),因为那样的话,它看起来像一个函数。为什么不是“sizeof”?但无论如何 +1。
  • @Kirilenko 是的,此运算符并不总是需要括号。但无论如何它只是在一些旁注中:)
【解决方案2】:

调用代码需要使用free()释放内存:

void f(int x)
{
    char *s = to_str(x);
    // ...
    free(s);
}

(顺便说一句,你有一个错误:在to_str 中,sizeof(s) 是指针的大小,而不是s 指向的字符串的长度。)

【讨论】:

  • 但它是 char*(函数)......这个问题看起来更值得一问,哪里是解除分配的最佳主意......
  • @V-X 你在说什么?这个答案是正确的!
  • @V-X:我既不理解你的评论也不理解你的反对意见——你能更详细地解释一下我误解的地方吗?
  • 问题是关于在函数外部传递指针,并且您提出了函数,该函数不返回任何内容。 size_of 是这个答案的唯一优点。
  • @V-X:你误解了我的回答。我的答案中的函数是调用问题中的函数to_str 的代码,然后释放它返回的内存。
【解决方案3】:

首先,sizeof() 是一个运算符,它在括号中为您提供类型(变量类型)的字节长度。因此,您得到的不是分配的内存块的实际长度,而是指针s 的大小,这通常不是您所期望的。

第二个,在分配内存的时候,要了解它没有被实际使用的那一刻,并在上面打上free()

另外,我不确定 5 符号 + 终止 0 是否足够长的字符串,因为x 中的垃圾字符串会更长,所以你可以破坏记忆。

【讨论】:

    【解决方案4】:

    最好不要在函数内部分配内存:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-06
      • 2016-07-16
      • 1970-01-01
      • 1970-01-01
      • 2012-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多