2009-08-18 34 views
3

我使用巧舌如簧被释放,
它有很多的返回应释放自己的字符串函数。

我可以将这些功能传递给其他功能吗?C /油嘴字符串应该由主叫方

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

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

我该如何释放从函数1返回的字符串?这是必要的吗?

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

+0

我们可以在主页面和问题页面看到一个问题是否已被回答或关闭,您不需要更改问题的标题。 – 2009-11-07 01:20:14

回答

6

是的,这是必要的,以释放function1返回的字符串。为了让您能够做到这一点,你需要采取的返回值的副本: -

gchar* temp = function1("something"); 
gchar* string = function2(temp); 
g_free(temp); 
g_free(string); 
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")); 

但在我看来,这可能是更多的努力比它的价值,任何人都在看你的代码可能会丢失,认为这是一个内存泄漏时没有,并改写它,并获得在运行时一个双free()错误击中,根本不知道发生了什么事情,

1

是的,这是真的,因为@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函数可以说是破坏性的。它不会创建给定字符串的副本。