我正在使用 glib,
它有很多返回字符串的函数,这些函数应该自己释放。
我可以将这些功能传递给其他功能吗?
示例: function1返回一个必须为调用者释放的字符串。 function2返回一个指向必须释放的字符串的指针。
gchar *string = function2(function1("something"));
g_free (string);
我应该如何释放从 function1 返回的字符串?这是必要的吗?
非常感谢,
对不起我的英语
是的,有必要释放返回的字符串function1
。为了允许您这样做,您需要获取返回值的副本:-
gchar* temp = function1("something");
gchar* string = function2(temp);
g_free(temp);
g_free(string);
在您给出的示例中:
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()
错误并且没有知道发生了什么,
是的,正如@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 函数可以说是破坏性的。它不会创建给定字符串的副本。