5

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

我可以将这些功能传递给其他功能吗?

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

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

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

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

4

3 回答 3

7

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

gchar* temp = function1("something");
gchar* string = function2(temp);
g_free(temp);
g_free(string);
于 2009-08-18T21:23:27.540 回答
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()错误并且没有知道发生了什么,

于 2009-08-18T21:23:44.920 回答
1

是的,正如@DaveRigby 和其他人指出的那样,您需要获取返回的指针值function1()才能释放它。但是有很大的如果

如果你指的是像g_string_append()as这样的 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 函数可以说是破坏性的。它不会创建给定字符串的副本。

于 2012-08-18T13:22:34.823 回答