我使用巧舌如簧被释放,
它有很多的返回应释放自己的字符串函数。
我可以将这些功能传递给其他功能吗?C /油嘴字符串应该由主叫方
示例:function1返回必须为调用者释放的字符串。 function2返回一个指向一个字符串的指针,该字符串也必须被释放。
gchar *string = function2(function1("something"));
g_free (string);
我该如何释放从函数1返回的字符串?这是必要的吗?
非常感谢,
和对不起我的英语
我使用巧舌如簧被释放,
它有很多的返回应释放自己的字符串函数。
我可以将这些功能传递给其他功能吗?C /油嘴字符串应该由主叫方
示例:function1返回必须为调用者释放的字符串。 function2返回一个指向一个字符串的指针,该字符串也必须被释放。
gchar *string = function2(function1("something"));
g_free (string);
我该如何释放从函数1返回的字符串?这是必要的吗?
非常感谢,
和对不起我的英语
是的,这是必要的,以释放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()
d)。
另一种方法是写周围function2()
的包装:
gchar *function2_wrapper(gchar *c)
{
gchar *ret = function2(c);
free(c);
return ret;
}
gchar *string = function2_wrapper(function1("something"));
但在我看来,这可能是更多的努力比它的价值,任何人都在看你的代码可能会丢失,认为这是一个内存泄漏时没有,并改写它,并获得在运行时一个双free()
错误击中,根本不知道发生了什么事情,
是的,这是真的,因为@DaveRigby等是pointed出来,那你需要获取从function1()
返回的指针值以释放它。但是如果有大的!
如果您指的是这样的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函数可以说是破坏性的。它不会创建给定字符串的副本。
我们可以在主页面和问题页面看到一个问题是否已被回答或关闭,您不需要更改问题的标题。 – 2009-11-07 01:20:14