2009-08-18 16 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函數可以說是破壞性的。它不會創建給定字符串的副本。