代码之家  ›  专栏  ›  技术社区  ›  Werner Echezuria

返回已分配的变量

  •  10
  • Werner Echezuria  · 技术社区  · 15 年前

    char *somefunction(int somearg){
        char *str;
    
        str=(char *)malloc(sizeof(char *));
    
        //some code
    
        return str;
    }
    

    我应该自由吗?我怎么能这么做?

    5 回复  |  直到 15 年前
        1
  •  13
  •   Matthew Iselin    15 年前

    您有两个选项:一个,将char*传递给somefunction并使用它,而不是在somefunction中进行分配;另一个,稍后释放返回值。

    char *somefunction(char *str, int somearg){
    
        //some code
    
        return str;
    }
    
    // Elsewhere...
    char *str = (char *) malloc....;
    somefunction(str, 123);
    // Code...
    free(str);
    

    第二种选择:

    char *somestr = somefunction(123);
    // Do something...
    free(somestr);
    

    我个人建议使用第一种方法,因为当没有在任意函数中分配内存时,可以更容易地避免内存泄漏。

        2
  •  4
  •   anon anon    15 年前

    当你用完它时,你可以把它释放出来。没有规则规定与malloc()匹配的free()必须在同一个函数中。

        3
  •  2
  •   Alex Rodrigues    15 年前

    您应该释放所有分配的空间,但如果您返回它,因为您将在程序的其他部分使用这些内存空间,因此在使用它之后,您应该释放它。查看调用函数的代码中的每个位置,并在使用返回值后释放空间。

        4
  •  2
  •   sharptooth    15 年前

    如果要返回块的地址,不应释放()块,而应依赖调用代码稍后释放()。这被称为在役通过。

    如果在函数中释放它并返回指针,则调用代码将运行未定义的行为,试图访问已释放的块。

        5
  •  2
  •   ezpz    15 年前

    strdup() 但这通常是个坏主意。要求用户知道函数调用内部发生了什么是一个不好的要求——想想有多少函数是你使用的,谁的内部对你隐藏的。