【问题标题】:C - freeing memory allocated in functionC - 释放函数中分配的内存
【发布时间】:2012-11-06 09:42:39
【问题描述】:

我有一个分配字符串并返回其指针的函数。直接调用其他函数时,需要释放内存吗?

例如:

char *getRow(){
     char *someString = (char*) malloc(sizeof(char) * 10);
     strcpy(someString , "asdqwezxc");
     return someString;
}

int main(){
     printf("%s", getRow());
}

在该函数中分配的内存会发生什么?有什么办法可以释放它还是我需要在使用之前将它存储到某个变量中?

【问题讨论】:

  • 这正式泄漏了分配的内存。在 this 代码中,这无关紧要,因为程序在此之后立即结束,但这不是一个好习惯。
  • 这是不好的做法,最好将指针作为引用传递,这样您就可以像标准库一样在函数外部分配和释放字符串。
  • 如果分配大小总是像本例中那样是静态的,则始终可以使用作为参数传递的固定大小缓冲区来获取行。就像char buf[10]; getRow(buf); 一样,虽然适用的情况有限,但您必须非常注意 getRow 的调用合约。 (换句话说,对于任何复杂的事情可能都是个坏主意,除非你有更多的约束。)
  • 不要将malloc的返回值投射到C:stackoverflow.com/questions/605845/…
  • 好的,谢谢,我只会使用参考

标签: c function memory allocation


【解决方案1】:

即使您已从函数返回,除非您明确这样做,否则不会释放内存。所以你必须存储返回值并调用free

int main(){
    char* str = getRow();
    printf("%s", str);
    free(str);
}

【讨论】:

  • 好的,谢谢,我只是希望有一些方法,因为像 printf("%s", getRow()); 这样的调用函数很舒服而不是存储它然后使用,尤其是当您需要使用不同的参数多次调用该函数时
  • 但是我该如何退货呢?局部变量在函数结束后死掉,不是吗?
【解决方案2】:

您需要将它存储在一个变量中,使用它,然后释放它。如果你不释放它,就会发生内存泄漏。

【讨论】:

    【解决方案3】:

    是的,你需要。 malloc 从堆中分配内存,您需要显式释放它。 char *someString 等变量是从堆栈中分配的,当函数返回时将被释放。我认为您误解了堆栈和堆。

    看看这个what-and-where-are-the-stack-and-heap

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-28
      • 1970-01-01
      相关资源
      最近更新 更多