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

时间:2009-08-18 21:16:40

标签: c glib

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

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

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

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

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

非常感谢,
抱歉我的英文

3 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分: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() d)的内存。

另一种方法是在function2()

周围编写一个包装器
gchar *function2_wrapper(gchar *c)
{
    gchar *ret = function2(c);
    free(c);
    return ret;
}

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

但是在我看来,这可能比它的价值更大,任何看着你的代码的人都可能会丢失,认为没有内存泄漏,并重写它并被双击 - {{1运行时出错并且不知道发生了什么,

答案 2 :(得分:1)

是的,正如@DaveRigby和其他人pointed一样,你需要获得从function1()返回的指针值来释放它。但是有很大的 if

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