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

5
我正在使用glib,它有很多返回应由本人释放的字符串的函数。我能把这些函数传递给其他函数吗?
示例:function1返回一个必须由调用者释放的字符串。function2也返回一个必须被释放的字符串指针。
gchar *string = function2(function1("something"));
g_free (string);

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

非常感谢,
对我的英语表示抱歉


我们可以在主页面和问题页面上看到一个问题是否已被回答或关闭,您不需要更改问题的标题。 - Dour High Arch
3个回答

7

需要释放由function1返回的字符串。为了让您能够这样做,您需要复制返回值:

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

3
在你提供的例子中:
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()的内存,您的程序将逐渐耗尽可用内存,导致程序变慢。

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

gchar *function2_wrapper(gchar *c)
{
    gchar *ret = function2(c);
    free(c);
    return ret;
}

gchar *string = function2_wrapper(function1("something"));

但我认为这可能比它值得的努力更多,而且任何查看您代码的人都可能会迷失方向,认为有内存泄漏,而实际上并没有,然后重写代码,在运行时遭遇双倍free() 错误,并不知道发生了什么。


1

是的,正如@DaveRigby和其他人所指出的那样,你需要获取从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函数可以说是破坏性的。它不会创建给定字符串的副本。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接