【问题标题】:C/Glib Strings that should be freed by the caller调用者应该释放的 C/Glib 字符串
【发布时间】:2010-11-20 18:16:01
【问题描述】:

我正在使用 glib,
它有很多返回字符串的函数,这些函数应该自己释放。

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

示例: function1 返回一个必须为调用者释放的字符串。 function2 返回一个指向必须释放的字符串的指针。

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

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

非常感谢,
对不起我的英语

【问题讨论】:

  • 我们可以在主页和问题页面看到一个问题是否已经回答或关闭,您不需要更改问题的标题。

标签: c glib


【解决方案1】:

是的,有必要释放function1 返回的字符串。要允许您这样做,您需要获取返回值的副本:-

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

【讨论】:

    【解决方案2】:

    在你给出的例子中:

    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);
    

    否则,每次该代码运行时,function1() 将分配更多永远不会被释放的内存,并且如果您的应用程序运行很长时间,您的程序将开始慢慢耗尽可用内存(因为所有分配内存永远不会是free()d)。

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

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

    但在我看来,这可能比它的价值更多的努力,并且任何查看您的代码的人都可能会丢失,认为没有内存泄漏,然后重写它并受到双重打击-free()运行时出错,不知道发生了什么,

    【讨论】:

      【解决方案3】:

      是的,这是真的,因为@DaveRigby 和其他人是pointed 出来的,你需要获取从function1() 返回的指针值来释放它。但是有很大的如果!

      如果您将像 g_string_append() 这样的 glib 函数称为 function1(),您应该不释放它。因为这些函数会返回您传递的内容。

      假设你有

      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 函数可以说是破坏性。它不会创建给定字符串的副本。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-03-19
        • 2011-01-17
        • 2020-07-20
        • 2019-09-16
        • 1970-01-01
        • 2019-02-22
        相关资源
        最近更新 更多