代码之家  ›  专栏  ›  技术社区  ›  drigoSkalWalker

调用方应释放的C/Glib字符串

  •  4
  • drigoSkalWalker  · 技术社区  · 16 年前




    我可以把这些函数传递给其他函数吗?

    例子: 功能1 返回调用者必须释放的字符串。 功能2 返回指向也必须释放的字符串的指针。

    gchar *string = function2(function1("something"));
    g_free (string);
    

    如何释放从function1返回的字符串?这有必要吗?


    对不起我的英语

    3 回复  |  直到 14 年前
        1
  •  7
  •   DaveR    16 年前

    是,必须释放返回的字符串 function1

    gchar* temp = function1("something");
    gchar* string = function2(temp);
    g_free(temp);
    g_free(string);
    
        2
  •  3
  •   Chris Lutz    16 年前

    在您给出的示例中:

    gchar *string = function2(function1("something"));
    g_free (string);
    

    不能 将字符串从 function1() . 这是内存泄漏。所以,虽然我知道压缩东西很好,但你应该放慢速度:

    gchar *temp, *string;
    temp = function1("something");
    string = function2(temp);
    g_free(temp);
    temp = NULL;
    g_free(string);
    

    否则,每次代码运行时, 职能1() free() d) 。

    另一种选择是编写一个包装器 function2() :

    gchar *function2_wrapper(gchar *c)
    {
        gchar *ret = function2(c);
        free(c);
        return ret;
    }
    
    gchar *string = function2_wrapper(function1("something"));
    

    但在我看来,这可能比它的价值更大,任何查看您的代码的人都可能会丢失,认为有内存泄漏,而实际上没有,然后重写它,并受到双重攻击- 免费的 运行时出错,不知道发生了什么,

        3
  •  1
  •   Community Mohan Dere    8 年前

    是的,这是真的,就像@DaveRigby和其他人一样 pointed out,您需要从中获取返回的指针值 function1() !

    如果您指的是像 g_string_append() 作为 职能1() ,你应该 释放它。因为这些函数返回您传递的内容。

    假设你有

    GString *s = g_string_new("foo");
    

    你想拥有 "http://foo/bar"

    s = g_string_prepend(g_string_append(s, "/bar"), "http://");
    use_my_string(s);
    g_string_free(s);
    

    我知道上面的例子不是最好的,但希望你能明白这一点。GString函数可以说是 . 它不会创建给定字符串的副本。