我正在使用glib,
它有很多函数可以返回应该自己释放的字符串。
我可以将这些函数传递给其他函数吗?
示例: function1 返回必须为调用方释放的字符串。 function2 返回一个指向必须同时释放的字符串的指针。
gchar *string = function2(function1("something"));
g_free (string);
我应该如何释放从function1返回的字符串?这有必要吗?
非常感谢,
抱歉我的英文
答案 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函数可以说是破坏性。它不会创建给定字符串的副本。