【问题标题】:How to "free" variable after end of the function?函数结束后如何“释放”变量?
【发布时间】:2016-06-13 13:51:06
【问题描述】:

在 C 中执行函数后(通过 malloc)释放分配的内存的正确方法是什么?我需要分配内存,以某种方式使用它并将其返回,而不是释放它。

char* someFunction(char* a, char* b) {
   char* result = (char*)malloc(la + 2 * sizeof(char));
   ...
   return result;
}

【问题讨论】:

  • char *str = someFunction(a, b); useitsomehow(str); free(str);
  • 嗯,这意味着我将返回指针,它可以作为“str”释放,因为它现在是完全相同的指针?
  • @JaxCze:是的,我也不会称它为“完全相同的指针”。它是一个不同的(指针)变量,具有完全相同的值,即指向同一个对象。
  • 如果您返回调用者必须释放的内存(并且如果您无法避免这种情况),那么您至少应该使用如下注释说明这一点:“调用者负责释放返回内存”。
  • 你没有释放一个变量,你释放了一些指针(它位于一个变量中,或者由某个函数或表达式返回) .请注意pointer aliasing。您需要定义并记录关于谁以及何时应该释放指针的约定。一些工具(例如valgrind...)可能有助于找到memory leaks

标签: c pointers malloc free


【解决方案1】:

使用free。在您的情况下,它将是:

char* result = malloc(la + 2 * sizeof(char));
...
free (result);

另外,如果你要返回分配的内存,就像strdup 那样,你的函数的调用者必须释放内存。喜欢:

result = somefunction ();
...
free (result);

如果您想在退货后释放它,那是不可能的。一旦你从函数中return 某些东西,它就会自动终止。

【讨论】:

  • 这段代码sn-p看起来很粗略,希望没有误会:你应该NOTfree内存返回之前!
【解决方案2】:

在调用someFunction的代码中。

您还必须在文档中明确说明(您有,对吗?!),调用者必须在使用完返回值后调用free

【讨论】:

    【解决方案3】:

    如果您返回分配的内存,则调用者有责任释放它。

    char *res;
    res = someFunction("something 1", "something 2");
    free(res);
    

    【讨论】:

      【解决方案4】:

      return它调用函数,然后只是free调用函数中的指针。

      【讨论】:

        【解决方案5】:

        如果您的意思是调用函数中不需要返回值并且由于其副作用而调用该函数,那么您可以编写

        free( someFunction( p, q ) );
        

        【讨论】:

        • 我不是这个意思,但是这个技巧对我很有用:) 谢谢
        猜你喜欢
        • 2012-12-14
        • 1970-01-01
        • 2012-03-11
        • 1970-01-01
        • 2017-10-16
        • 2014-03-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多